mirror of
https://github.com/curl/curl.git
synced 2026-08-25 01:33:31 +03:00
- 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:
parent
eff2c3a621
commit
391e8afd1f
7 changed files with 48 additions and 18 deletions
41
lib/sendf.c
41
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);
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue