Jacek Caban : wininet: Don' t pass BLOCKING_WAITALL to NETCON_recv in netconn_read.

Alexandre Julliard julliard at wine.codeweavers.com
Tue Jun 16 10:13:14 CDT 2015


Module: wine
Branch: master
Commit: 049a3ba40153253e40177d05e47cd59b0144c86c
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=049a3ba40153253e40177d05e47cd59b0144c86c

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Tue Jun 16 12:24:54 2015 +0200

wininet: Don't pass BLOCKING_WAITALL to NETCON_recv in netconn_read.

---

 dlls/wininet/http.c | 25 +++++++++++++++----------
 1 file changed, 15 insertions(+), 10 deletions(-)

diff --git a/dlls/wininet/http.c b/dlls/wininet/http.c
index b7c4661..f4f67cb 100644
--- a/dlls/wininet/http.c
+++ b/dlls/wininet/http.c
@@ -2659,24 +2659,29 @@ static DWORD netconn_read(data_stream_t *stream, http_request_t *req, BYTE *buf,
 {
     netconn_stream_t *netconn_stream = (netconn_stream_t*)stream;
     DWORD res = ERROR_SUCCESS;
-    int len = 0;
+    int len = 0, ret = 0;
 
     size = min(size, netconn_stream->content_length-netconn_stream->content_read);
 
     if(size && is_valid_netconn(req->netconn)) {
-        if((res = NETCON_recv(req->netconn, buf, size, blocking_mode, &len))) {
-            len = 0;
-            if(blocking_mode == BLOCKING_DISALLOW && res == WSAEWOULDBLOCK)
-                res = ERROR_SUCCESS;
-            else
+        while((res = NETCON_recv(req->netconn, buf+ret, size-ret,
+                             blocking_mode == BLOCKING_WAITALL ? BLOCKING_ALLOW : blocking_mode, &len)) == ERROR_SUCCESS) {
+            if(!len) {
                 netconn_stream->content_length = netconn_stream->content_read;
-        }else if(!len) {
-            netconn_stream->content_length = netconn_stream->content_read;
+                break;
+            }
+            ret += len;
+            netconn_stream->content_read += len;
+            if(blocking_mode != BLOCKING_WAITALL || size == ret)
+                break;
         }
+
+        if(ret || (blocking_mode == BLOCKING_DISALLOW && res == WSAEWOULDBLOCK))
+            res = ERROR_SUCCESS;
     }
 
-    netconn_stream->content_read += *read = len;
-    TRACE("read %u bytes\n", len);
+    TRACE("read %u bytes\n", ret);
+    *read = ret;
     return res;
 }
 




More information about the wine-cvs mailing list