diff options
| author | Daniel Stenberg <daniel@haxx.se> | 2008-09-22 23:12:00 +0000 | 
|---|---|---|
| committer | Daniel Stenberg <daniel@haxx.se> | 2008-09-22 23:12:00 +0000 | 
| commit | 391e8afd1f6695cb57738790676cfa4d57d54bcb (patch) | |
| tree | 5752243fa1fbf088953fa101c0a542873f2050cb /lib | |
| parent | eff2c3a621c539713ecd641c020f06ac28a7ea1d (diff) | |
- 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.
Diffstat (limited to 'lib')
| -rw-r--r-- | lib/sendf.c | 41 | ||||
| -rw-r--r-- | lib/sendf.h | 6 | ||||
| -rw-r--r-- | lib/socks.c | 2 | 
3 files changed, 36 insertions, 13 deletions
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;  | 
