From fcccf9aa0d93c666e8ae31ebdde716cddd6b4482 Mon Sep 17 00:00:00 2001 From: Daniel Stenberg Date: Sat, 16 Dec 2006 21:33:51 +0000 Subject: [PATCH] Brendan Jurd provided a fix that now prevents libcurl from getting a SIGPIPE during certain conditions when GnuTLS is used. --- CHANGES | 4 ++++ RELEASE-NOTES | 3 ++- lib/gtls.c | 24 ++++++++++++++++++++++++ 3 files changed, 30 insertions(+), 1 deletion(-) diff --git a/CHANGES b/CHANGES index d807af2ca..acd7ed763 100644 --- a/CHANGES +++ b/CHANGES @@ -6,6 +6,10 @@ Changelog +Daniel (16 December 2006) +- Brendan Jurd provided a fix that now prevents libcurl from getting a SIGPIPE + during certain conditions when GnuTLS is used. + Daniel (11 December 2006) - Alexey Simak found out that when doing FTP with the multi interface and something went wrong like it got a bad response code back from the server, diff --git a/RELEASE-NOTES b/RELEASE-NOTES index f40c2ff3b..d1823d4b8 100644 --- a/RELEASE-NOTES +++ b/RELEASE-NOTES @@ -35,6 +35,7 @@ This release includes the following bugfixes: o rate limiting works better o getting FTP response code errors when using the multi-interface caused libcurl to leak memory + o no more SIGPIPE when GnuTLS is used Other curl-related news: @@ -53,6 +54,6 @@ advice from friends like these: James Housley, Olaf Stueben, Yang Tse, Gisle Vanem, Bradford Bruce, Ciprian Badescu, Dmitriy Sergeyev, Nir Soffer, Venkat Akella, Toon Verwaest, Matt Witherspoon, Alexey Simak, Martin Skinner, Sh Diao, Jared Lundell, - Stefan Krause, Sebastien Willemijns, Alexey Simak + Stefan Krause, Sebastien Willemijns, Alexey Simak, Brendan Jurd Thanks! (and sorry if I forgot to mention someone) diff --git a/lib/gtls.c b/lib/gtls.c index ee7612028..bbd87161d 100644 --- a/lib/gtls.c +++ b/lib/gtls.c @@ -67,6 +67,23 @@ static void tls_log_func(int level, const char *str) } #endif +/* + * Custom push and pull callback functions used by GNU TLS to read and write + * to the socket. These functions are simple wrappers to send() and recv() + * (although here using the sread/swrite macros as defined by setup_once.h). + * We use custom functions rather than the GNU TLS defaults because it allows + * us to get specific about the fourth "flags" argument, and to use arbitrary + * private data with gnutls_transport_set_ptr if we wish. + */ +static ssize_t Curl_gtls_push(void *s, const void *buf, size_t len) +{ + return swrite(s, buf, len); +} + +static ssize_t Curl_gtls_pull(void *s, void *buf, size_t len) +{ + return sread(s, buf, len); +} /* Global GnuTLS init, called from Curl_ssl_init() */ int Curl_gtls_init(void) @@ -285,6 +302,13 @@ Curl_gtls_connect(struct connectdata *conn, gnutls_transport_set_ptr(session, (gnutls_transport_ptr)conn->sock[sockindex]); + /* register callback functions to send and receive data. */ + gnutls_transport_set_push_function(session, Curl_gtls_push); + gnutls_transport_set_pull_function(session, Curl_gtls_pull); + + /* lowat must be set to zero when using custom push and pull functions. */ + gnutls_transport_set_lowat(session, 0); + /* This might be a reconnect, so we check for a session ID in the cache to speed up things */