Index: lib/sendf.c
===================================================================
RCS file: /cvsroot/curl/curl/lib/sendf.c,v
retrieving revision 1.106
diff -u -r1.106 sendf.c
--- lib/sendf.c	12 Sep 2006 23:51:01 -0000	1.106
+++ lib/sendf.c	17 Sep 2006 08:41:54 -0000
@@ -518,6 +518,36 @@
   return CURLE_OK;
 }
 
+/*
+ * Does the same as Curl_read() but it blocks until all bytes amount of
+ * buffersize will be read. No more, no less.
+ */
+int Curl_read_all(struct connectdata *conn, /* connection data */
+                  curl_socket_t sockfd,     /* read from this socket */
+                  char *buf,                /* store read data here */
+                  size_t buffersize,        /* max amount to read */
+                  ssize_t *n)               /* amount bytes read */
+{
+  ssize_t nread;
+  ssize_t allread = 0;
+  *n=0;
+  do {
+    int result = Curl_read(conn, sockfd, buf, buffersize, &nread);
+    if(CURLE_OK != result) {
+      return result;
+    }
+    if(buffersize == nread)
+    {
+      allread += nread;
+      *n = allread;
+      return CURLE_OK;
+    }
+    buffersize -= nread;
+    buf += nread;
+    allread += nread;
+  } while(1);
+}
+
 /* return 0 on success */
 static int showit(struct SessionHandle *data, curl_infotype type,
                   char *ptr, size_t size)
Index: lib/sendf.h
===================================================================
RCS file: /cvsroot/curl/curl/lib/sendf.h,v
retrieving revision 1.32
diff -u -r1.32 sendf.h
--- lib/sendf.h	7 Sep 2006 21:49:22 -0000	1.32
+++ lib/sendf.h	17 Sep 2006 08:22:58 -0000
@@ -57,6 +57,11 @@
 int Curl_read(struct connectdata *conn, curl_socket_t sockfd,
               char *buf, size_t buffersize,
               ssize_t *n);
+/* does the same as Curl_read(), but it blocks until entire buffer will be
+   filled.*/
+int Curl_read_all(struct connectdata *conn, curl_socket_t sockfd,
+                  char *buf, size_t buffersize,
+                  ssize_t *n);
 /* internal write-function, does plain socket, SSL and krb4 */
 CURLcode Curl_write(struct connectdata *conn,
                     curl_socket_t sockfd,
Index: lib/url.c
===================================================================
RCS file: /cvsroot/curl/curl/lib/url.c,v
retrieving revision 1.535
diff -u -r1.535 url.c
--- lib/url.c	16 Sep 2006 21:50:29 -0000	1.535
+++ lib/url.c	17 Sep 2006 08:29:44 -0000
@@ -2222,7 +2222,7 @@
     packetsize = 8; /* receive data size */
 
     /* Receive response */
-    result = Curl_read(conn, sock, (char *)socksreq, packetsize, &actualread);
+    result = Curl_read_all(conn, sock, (char *)socksreq, packetsize, &actualread);
     if ((result != CURLE_OK) || (actualread != packetsize)) {
       failf(data, "Failed to receive SOCKS4 connect request ack.");
       return 1;
@@ -2407,7 +2407,7 @@
 
   Curl_nonblock(sock, FALSE);
 
-  result=Curl_read(conn, sock, (char *)socksreq, 2, &actualread);
+  result=Curl_read_all(conn, sock, (char *)socksreq, 2, &actualread);
   if ((result != CURLE_OK) || (actualread != 2)) {
     failf(data, "Unable to receive initial SOCKS5 response.");
     return 1;
@@ -2456,7 +2456,7 @@
       return 1;
     }
 
-    result=Curl_read(conn, sock, (char *)socksreq, 2, &actualread);
+    result=Curl_read_all(conn, sock, (char *)socksreq, 2, &actualread);
     if ((result != CURLE_OK) || (actualread != 2)) {
       failf(data, "Unable to receive SOCKS5 sub-negotiation response.");
       return 1;
@@ -2556,7 +2556,7 @@
       return 1;
     }
 
-    result = Curl_read(conn, sock, (char *)socksreq, packetsize, &actualread);
+    result = Curl_read_all(conn, sock, (char *)socksreq, packetsize, &actualread);
     if ((result != CURLE_OK) || (actualread != packetsize)) {
       failf(data, "Failed to receive SOCKS5 connect request ack.");
       return 1;
