aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniel Stenberg <daniel@haxx.se>2006-05-04 06:00:40 +0000
committerDaniel Stenberg <daniel@haxx.se>2006-05-04 06:00:40 +0000
commit758f6eed5169f20635c410077b840c1ffb741ddb (patch)
tree21f4ecfc8c79c10bd12b2bc7f09399fc30376298
parent80ee5d3bd82343dc7064e6754032690d8b6887b2 (diff)
Mark Eichin submitted bug report #1480821
(http://curl.haxx.se/bug/view.cgi?id=1480821) He found and identified a problem with how libcurl dealt with GnuTLS and a case where gnutls returned GNUTLS_E_AGAIN indicating it would block. It would then return an unexpected return code, making Curl_ssl_send() confuse the upper layer - causing random 28 bytes trash data to get inserted in the transfered stream. The proper fix was to make the Curl_gtls_send() function return the proper return codes that the callers would expect. The Curl_ossl_send() function already did this.
-rw-r--r--CHANGES12
-rw-r--r--RELEASE-NOTES3
-rw-r--r--lib/gtls.c6
3 files changed, 20 insertions, 1 deletions
diff --git a/CHANGES b/CHANGES
index 4d87132d4..4154ff20a 100644
--- a/CHANGES
+++ b/CHANGES
@@ -6,6 +6,18 @@
Changelog
+Daniel (4 May 2006)
+- Mark Eichin submitted bug report #1480821
+ (http://curl.haxx.se/bug/view.cgi?id=1480821) He found and identified a
+ problem with how libcurl dealt with GnuTLS and a case where gnutls returned
+ GNUTLS_E_AGAIN indicating it would block. It would then return an unexpected
+ return code, making Curl_ssl_send() confuse the upper layer - causing random
+ 28 bytes trash data to get inserted in the transfered stream.
+
+ The proper fix was to make the Curl_gtls_send() function return the proper
+ return codes that the callers would expect. The Curl_ossl_send() function
+ already did this.
+
Daniel (2 May 2006)
- Added a --checkfor option to curl-config to allow users to easier
write for example shell scripts that test for the presence of a
diff --git a/RELEASE-NOTES b/RELEASE-NOTES
index 810ffda92..1fe83f38c 100644
--- a/RELEASE-NOTES
+++ b/RELEASE-NOTES
@@ -20,6 +20,7 @@ This release includes the following changes:
This release includes the following bugfixes:
+ o GnuTLS non-block case that could cause data trashing
o deflate code survives lack of zlib header
o CURLOPT_INTERFACE works with hostname
o configure runs fine with ICC
@@ -46,6 +47,6 @@ advice from friends like these:
Dan Fandrich, Ilja van Sprundel, David McCreedy, Tor Arntsen, Xavier Bouchoux,
David Byron, Michele Bini, Ates Goral, Katie Wang, Robson Braga Araujo,
- Ale Vesely, Paul Querna, Gisle Vanem
+ Ale Vesely, Paul Querna, Gisle Vanem, Mark Eichin
Thanks! (and sorry if I forgot to mention someone)
diff --git a/lib/gtls.c b/lib/gtls.c
index 5d3959cce..4cf78080b 100644
--- a/lib/gtls.c
+++ b/lib/gtls.c
@@ -458,6 +458,12 @@ int Curl_gtls_send(struct connectdata *conn,
int rc;
rc = gnutls_record_send(conn->ssl[sockindex].session, mem, len);
+ if(rc < 0 ) {
+ if(rc == GNUTLS_E_AGAIN)
+ return 0; /* EWOULDBLOCK equivalent */
+ rc = -1; /* generic error code for send failure */
+ }
+
return rc;
}