提交 9abe1e43 编写于 作者: M Matthias Bolte

remote: Fix TLS transport on Windows

gnulib wraps Windows' SOCKET handle based send() and recv() functions
into file descriptor based ones that are used in libvirt.

Even though GnuTLS is using gnulib too, it explicitly doesn't use
gnulib's replacement functions on Windows. By default GnuTLS uses the
SOCKET handle based send() and recv(). This makes gnutls_handshake()
fail internally with a WSAENOTSOCK error because libvirt passes a
file descriptor; GnuTLS needs the SOCKET handle.

To avoid this mismatch make sure that GnuTLS uses gnulib's replacment
functions, by setting custom pull() and push() functions for GnuTLS.
上级 b2399b06
......@@ -1212,6 +1212,20 @@ initialize_gnutls(void)
static int verify_certificate (virConnectPtr conn, struct private_data *priv, gnutls_session_t session);
#if HAVE_WINSOCK2_H
static ssize_t
custom_gnutls_push(void *s, const void *buf, size_t len)
{
return send((size_t)s, buf, len, 0);
}
static ssize_t
custom_gnutls_pull(void *s, void *buf, size_t len)
{
return recv((size_t)s, buf, len, 0);
}
#endif
static gnutls_session_t
negotiate_gnutls_on_connection (virConnectPtr conn,
struct private_data *priv,
......@@ -1266,6 +1280,13 @@ negotiate_gnutls_on_connection (virConnectPtr conn,
gnutls_transport_set_ptr (session,
(gnutls_transport_ptr_t) (long) priv->sock);
#if HAVE_WINSOCK2_H
/* Make sure GnuTLS uses gnulib's replacment functions for send() and
* recv() on Windows */
gnutls_transport_set_push_function(session, custom_gnutls_push);
gnutls_transport_set_pull_function(session, custom_gnutls_pull);
#endif
/* Perform the TLS handshake. */
again:
err = gnutls_handshake (session);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册