[PATCH] remote: Fix TLS transport on Windows

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



gnulib wraps Windows' SOCKET handle based send() and recv() functions
into file descriptor based ones that are use in libvirt. By default
GnuTLS uses the SOCKET handle based send() and recv() on Windows. 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.
---
 src/remote/remote_driver.c |   21 +++++++++++++++++++++
 1 files changed, 21 insertions(+), 0 deletions(-)

diff --git a/src/remote/remote_driver.c b/src/remote/remote_driver.c
index f45476a..87977ab 100644
--- a/src/remote/remote_driver.c
+++ b/src/remote/remote_driver.c
@@ -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((int)(long)s, buf, len, 0);
+}
+
+static ssize_t
+custom_gnutls_pull(void *s, void *buf, size_t len)
+{
+    return recv((int)(long)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);
-- 
1.7.0.4

--
libvir-list mailing list
libvir-list@xxxxxxxxxx
https://www.redhat.com/mailman/listinfo/libvir-list


[Index of Archives]     [Virt Tools]     [Libvirt Users]     [Lib OS Info]     [Fedora Users]     [Fedora Desktop]     [Fedora SELinux]     [Big List of Linux Books]     [Yosemite News]     [KDE Users]     [Fedora Tools]