diff options
-rw-r--r-- | CHANGES | 4 | ||||
-rw-r--r-- | RELEASE-NOTES | 3 | ||||
-rw-r--r-- | lib/gtls.c | 24 |
3 files changed, 30 insertions, 1 deletions
@@ -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 */ |