- 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.
This commit is contained in:
Daniel Stenberg 2008-09-22 23:12:00 +00:00
parent eff2c3a621
commit 391e8afd1f
7 changed files with 48 additions and 18 deletions

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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