summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniel Stenberg <daniel@haxx.se>2008-09-22 23:12:00 +0000
committerDaniel Stenberg <daniel@haxx.se>2008-09-22 23:12:00 +0000
commit391e8afd1f6695cb57738790676cfa4d57d54bcb (patch)
tree5752243fa1fbf088953fa101c0a542873f2050cb
parenteff2c3a621c539713ecd641c020f06ac28a7ea1d (diff)
downloadcurl-391e8afd1f6695cb57738790676cfa4d57d54bcb.tar.gz
- Made the SOCKS code use the new Curl_read_plain() function to fix the bug
Markus Moeller reported: http://curl.haxx.se/mail/archive-2008-09/0016.html - recv() errors other than those equal to EAGAIN now cause proper CURLE_RECV_ERROR to get returned. This made test case 160 fail so I've now disabled it until we can figure out another way to exercise that logic.
-rw-r--r--CHANGES7
-rw-r--r--RELEASE-NOTES4
-rw-r--r--TODO-RELEASE5
-rw-r--r--lib/sendf.c41
-rw-r--r--lib/sendf.h6
-rw-r--r--lib/socks.c2
-rw-r--r--tests/data/DISABLED1
7 files changed, 48 insertions, 18 deletions
diff --git a/CHANGES b/CHANGES
index 912991fc6..da2554c67 100644
--- a/CHANGES
+++ b/CHANGES
@@ -7,6 +7,13 @@
Changelog
Daniel Stenberg (22 Sep 2008)
+- Made the SOCKS code use the new Curl_read_plain() function to fix the bug
+ Markus Moeller reported: http://curl.haxx.se/mail/archive-2008-09/0016.html
+
+- recv() errors other than those equal to EAGAIN now cause proper
+ CURLE_RECV_ERROR to get returned. This made test case 160 fail so I've now
+ disabled it until we can figure out another way to exercise that logic.
+
- Michael Goffioul filed bug report #2107377 "Problem with mutli + GnuTLS +
proxy" (http://curl.haxx.se/bug/view.cgi?id=2107377) that showed how a multi
interface using program didn't work when built with GnuTLS and a CONNECT
diff --git a/RELEASE-NOTES b/RELEASE-NOTES
index 185457c61..41928f82c 100644
--- a/RELEASE-NOTES
+++ b/RELEASE-NOTES
@@ -23,6 +23,8 @@ This release includes the following bugfixes:
o HTTP pipelining over proxy
o fix regression in configure script which affected OpenSSL builds on MSYS
o GnuTLS-based multi interface doing HTTPS over proxy failed
+ o recv() failures cause CURLE_RECV_ERROR
+ o SFTP over SOCKS crash fixed
This release includes the following known bugs:
@@ -37,6 +39,6 @@ advice from friends like these:
Keith Mok, Yang Tse, Daniel Fandrich, Guenter Knauf, Dmitriy Sergeyev,
Linus Nielsen Feltzing, Martin Drasar, Stefan Krause, Dmitry Kurochkin,
- Mike Revi, Andres Garcia, Michael Goffioul
+ Mike Revi, Andres Garcia, Michael Goffioul, Markus Moeller
Thanks! (and sorry if I forgot to mention someone)
diff --git a/TODO-RELEASE b/TODO-RELEASE
index 576e846b8..9aba548e7 100644
--- a/TODO-RELEASE
+++ b/TODO-RELEASE
@@ -7,10 +7,6 @@ To be addressed before 7.19.1 (planned release: October/November 2008)
168 - curl_easy_pause bugs (still under discussion)
-169 - curl crash when using sftp with socks. We need a Curl_plain_read() to
- use for the SOCKS code in the same style I made the Curl_plain_write()
- before.
-
171 - [PATCH] add some locking for thread-safety to NSS implementation
172 - Apply the getdate patch with Jamie Lokier's date function. Needs an
@@ -27,3 +23,4 @@ To be addressed before 7.19.1 (planned release: October/November 2008)
Patch: http://sourceforge.net/tracker/index.php?func=detail&aid=2107803&group_id=976&atid=100976
176 -
+
diff --git a/lib/sendf.c b/lib/sendf.c
index 568e7b8cd..79d34de60 100644
--- a/lib/sendf.c
+++ b/lib/sendf.c
@@ -534,6 +534,30 @@ CURLcode Curl_client_write(struct connectdata *conn,
return CURLE_OK;
}
+CURLcode Curl_read_plain(curl_socket_t sockfd,
+ char *buf,
+ size_t bytesfromsocket,
+ ssize_t *n)
+{
+ ssize_t nread = sread(sockfd, buf, bytesfromsocket);
+
+ if(-1 == nread) {
+ int err = SOCKERRNO;
+#ifdef USE_WINSOCK
+ if(WSAEWOULDBLOCK == err)
+#else
+ if((EWOULDBLOCK == err) || (EAGAIN == err) || (EINTR == err))
+#endif
+ return -1;
+ else
+ return CURLE_RECV_ERROR;
+ }
+
+ /* we only return number of bytes read when we return OK */
+ *n = nread;
+ return CURLE_OK;
+}
+
#ifndef MIN
#define MIN(a,b) ((a) < (b) ? (a) : (b))
#endif
@@ -613,20 +637,13 @@ int Curl_read(struct connectdata *conn, /* connection data */
if(conn->sec_complete)
nread = Curl_sec_read(conn, sockfd, buffertofill,
bytesfromsocket);
- else
- nread = sread(sockfd, buffertofill, bytesfromsocket);
-
- if(-1 == nread) {
- int err = SOCKERRNO;
-#ifdef USE_WINSOCK
- if(WSAEWOULDBLOCK == err)
-#else
- if((EWOULDBLOCK == err) || (EAGAIN == err) || (EINTR == err))
-#endif
- return -1;
+ else {
+ CURLcode ret = Curl_read_plain(sockfd, buffertofill, bytesfromsocket,
+ &nread);
+ if(ret)
+ return ret;
}
}
-
if(nread >= 0) {
if(pipelining) {
memcpy(buf, conn->master_buffer, nread);
diff --git a/lib/sendf.h b/lib/sendf.h
index 2d507ee23..71ad6febd 100644
--- a/lib/sendf.h
+++ b/lib/sendf.h
@@ -58,6 +58,12 @@ CURLcode Curl_client_write(struct connectdata *conn, int type, char *ptr,
void Curl_read_rewind(struct connectdata *conn,
size_t extraBytesRead);
+/* internal read-function, does plain socket only */
+CURLcode Curl_read_plain(curl_socket_t sockfd,
+ char *buf,
+ size_t bytesfromsocket,
+ ssize_t *n);
+
/* internal read-function, does plain socket, SSL and krb4 */
int Curl_read(struct connectdata *conn, curl_socket_t sockfd,
char *buf, size_t buffersize,
diff --git a/lib/socks.c b/lib/socks.c
index d2cb65522..9bbb0a7f4 100644
--- a/lib/socks.c
+++ b/lib/socks.c
@@ -88,7 +88,7 @@ static int blockread_all(struct connectdata *conn, /* connection data */
result = ~CURLE_OK;
break;
}
- result = Curl_read(conn, sockfd, buf, buffersize, &nread);
+ result = Curl_read_plain(sockfd, buf, buffersize, &nread);
if(result)
break;
diff --git a/tests/data/DISABLED b/tests/data/DISABLED
index 2055e9f16..9fe82a528 100644
--- a/tests/data/DISABLED
+++ b/tests/data/DISABLED
@@ -3,3 +3,4 @@
# test cases are run by runtests.pl. Just add the plain test case numbers, one
# per line.
# Lines starting with '#' letters are treated as comments.
+160