libprelude/master: Fix Win32 compatibility breakage dues to a GnuTLS change

[email protected] Fri, 29 Jan 2010 18:01:00 +0100 (CET)
Newsgroups gmane.comp.security.ids.prelude.cvs
Message-ID <[email protected]>
commit d07c76e008a486d3e2accffefeb4a646f5181763
Author: Yoann Vandoorselaere <[email protected]>
Date:   Thu Jan 21 21:43:26 2010 +0100

    Fix Win32 compatibility breakage dues to a GnuTLS change
    
    GnuTLS seems to use internal send/recv function that are incompatible
    with the way we manage socket on Win32 system.
    
    This change introduce our own push/pull function callback, used by
    GnuTLS, and restore Win32 compatibility.


========================================

 prelude-admin/prelude-admin.c |   48 +++++++++++++++++++++++++++++++++++------
 prelude-admin/server.c        |   47 +++++++++++++++++++++++++++++++++++-----
 src/tls-auth.c                |   32 +++++++++++++++++++++++++-
 3 files changed, 112 insertions(+), 15 deletions(-)

========================================

diff --git a/prelude-admin/prelude-admin.c b/prelude-admin/prelude-admin.c
index 9f87c4d..85847fb 100644
--- a/prelude-admin/prelude-admin.c
+++ b/prelude-admin/prelude-admin.c
@@ -841,6 +841,44 @@ static int anon_check_passwd(prelude_io_t *fd, char *passwd)
 }
 
 
+static inline gnutls_transport_ptr fd_to_ptr(int fd)
+{
+        union {
+                gnutls_transport_ptr ptr;
+                int fd;
+        } data;
+
+        data.fd = fd;
+
+        return data.ptr;
+}
+
+
+static inline int ptr_to_fd(gnutls_transport_ptr ptr)
+{
+        union {
+                gnutls_transport_ptr ptr;
+                int fd;
+        } data;
+
+        data.ptr = ptr;
+
+        return data.fd;
+}
+
+
+static ssize_t tls_pull(gnutls_transport_ptr fd, void *buf, size_t count)
+{
+        return read(ptr_to_fd(fd), buf, count);
+}
+
+
+
+static ssize_t tls_push(gnutls_transport_ptr fd, const void *buf, size_t count)
+{
+        return write(ptr_to_fd(fd), buf, count);
+}
+
 
 static gnutls_session new_tls_session(int sock, char *passwd)
 {
@@ -856,11 +894,6 @@ static gnutls_session new_tls_session(int sock, char *passwd)
                 0
         };
 
-        union {
-                int fd;
-                void *ptr;
-        } data;
-
         gnutls_init(&session, GNUTLS_CLIENT);
         gnutls_set_default_priority(session);
         gnutls_kx_set_priority(session, kx_priority);
@@ -877,8 +910,9 @@ static gnutls_session new_tls_session(int sock, char *passwd)
         gnutls_anon_allocate_client_credentials(&anoncred);
         gnutls_credentials_set(session, GNUTLS_CRD_ANON, anoncred);
 
-        data.fd = sock;
-        gnutls_transport_set_ptr(session, data.ptr);
+        gnutls_transport_set_ptr(session, fd_to_ptr(sock));
+        gnutls_transport_set_pull_function(session, tls_pull);
+        gnutls_transport_set_push_function(session, tls_push);
 
         ret = gnutls_handshake(session);
         if ( ret < 0 ) {
diff --git a/prelude-admin/server.c b/prelude-admin/server.c
index e0aba78..b17e26c 100644
--- a/prelude-admin/server.c
+++ b/prelude-admin/server.c
@@ -97,6 +97,44 @@ static int anon_check_passwd(prelude_io_t *fd)
 }
 
 
+static inline gnutls_transport_ptr fd_to_ptr(int fd)
+{
+        union {
+                gnutls_transport_ptr ptr;
+                int fd;
+        } data;
+
+        data.fd = fd;
+
+        return data.ptr;
+}
+
+
+static inline int ptr_to_fd(gnutls_transport_ptr ptr)
+{
+        union {
+                gnutls_transport_ptr ptr;
+                int fd;
+        } data;
+
+        data.ptr = ptr;
+
+        return data.fd;
+}
+
+
+static ssize_t tls_pull(gnutls_transport_ptr fd, void *buf, size_t count)
+{
+        return read(ptr_to_fd(fd), buf, count);
+}
+
+
+
+static ssize_t tls_push(gnutls_transport_ptr fd, const void *buf, size_t count)
+{
+        return write(ptr_to_fd(fd), buf, count);
+}
+
 
 static gnutls_session new_tls_session(int sock)
 {
@@ -108,10 +146,6 @@ static gnutls_session new_tls_session(int sock)
                 GNUTLS_KX_SRP, GNUTLS_KX_SRP_DSS, GNUTLS_KX_SRP_RSA,
 #endif
                 0 };
-        union {
-                int fd;
-                void *ptr;
-        } data;
 
         gnutls_init(&session, GNUTLS_SERVER);
 
@@ -124,8 +158,9 @@ static gnutls_session new_tls_session(int sock)
 #endif
         gnutls_credentials_set(session, GNUTLS_CRD_ANON, anoncred);
 
-        data.fd = sock;
-        gnutls_transport_set_ptr(session, data.ptr);
+        gnutls_transport_set_ptr(session, fd_to_ptr(sock));
+        gnutls_transport_set_pull_function(session, tls_pull);
+        gnutls_transport_set_push_function(session, tls_push);
 
         ret = gnutls_handshake(session);
         if ( ret < 0 ) {
diff --git a/src/tls-auth.c b/src/tls-auth.c
index b78e9a9..9f39c29 100644
--- a/src/tls-auth.c
+++ b/src/tls-auth.c
@@ -180,10 +180,10 @@ static int handle_gnutls_error(gnutls_session session, int ret)
 
 
 
-static void *fd_to_ptr(int fd)
+static inline gnutls_transport_ptr fd_to_ptr(int fd)
 {
         union {
-                void *ptr;
+                gnutls_transport_ptr ptr;
                 int fd;
         } data;
 
@@ -193,6 +193,18 @@ static void *fd_to_ptr(int fd)
 }
 
 
+static inline int ptr_to_fd(gnutls_transport_ptr ptr)
+{
+        union {
+                gnutls_transport_ptr ptr;
+                int fd;
+        } data;
+
+        data.ptr = ptr;
+
+        return data.fd;
+}
+
 
 static void set_default_priority(gnutls_session session)
 {
@@ -237,6 +249,20 @@ int tls_auth_init_priority(const char *tlsopts)
 }
 
 
+
+static ssize_t tls_pull(gnutls_transport_ptr fd, void *buf, size_t count)
+{
+        return read(ptr_to_fd(fd), buf, count);
+}
+
+
+
+static ssize_t tls_push(gnutls_transport_ptr fd, const void *buf, size_t count)
+{
+        return write(ptr_to_fd(fd), buf, count);
+}
+
+
 int tls_auth_connection(prelude_client_profile_t *cp, prelude_io_t *io, int crypt,
                         uint64_t *analyzerid, prelude_connection_permission_t *permission)
 {
@@ -263,6 +289,8 @@ int tls_auth_connection(prelude_client_profile_t *cp, prelude_io_t *io, int cryp
 
         fd = prelude_io_get_fd(io);
         gnutls_transport_set_ptr(session, fd_to_ptr(fd));
+        gnutls_transport_set_pull_function(session, tls_pull);
+        gnutls_transport_set_push_function(session, tls_push);
 
         do {
                 ret = gnutls_handshake(session);
_______________________________________________
Prelude-cvslog site list
[email protected]
http://lists.prelude-ids.org/mailman/listinfo/prelude-cvslog