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