Brendan Jurd provided a fix that now prevents libcurl from getting a SIGPIPE

during certain conditions when GnuTLS is used.
This commit is contained in:
Daniel Stenberg 2006-12-16 21:33:51 +00:00
parent 72bd027537
commit fcccf9aa0d
3 changed files with 30 additions and 1 deletions

View File

@ -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,

View File

@ -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)

View File

@ -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 */