[PATCH 2/6] winhttp: Propagate errors from refill_buffer.

Hans Leidekker hans at codeweavers.com
Fri Nov 23 04:35:27 CST 2018


Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=38228
Signed-off-by: Hans Leidekker <hans at codeweavers.com>
---
 dlls/winhttp/request.c | 49 +++++++++++++++++++++++++++++++++++--------------
 1 file changed, 35 insertions(+), 14 deletions(-)

diff --git a/dlls/winhttp/request.c b/dlls/winhttp/request.c
index 9817287fe2..61af6ea977 100644
--- a/dlls/winhttp/request.c
+++ b/dlls/winhttp/request.c
@@ -1949,6 +1949,7 @@ static BOOL end_of_read_data( struct request *request )
 static BOOL read_data( struct request *request, void *buffer, DWORD size, DWORD *read, BOOL async )
 {
     int count, bytes_read = 0;
+    BOOL ret = TRUE;
 
     if (end_of_read_data( request )) goto done;
 
@@ -1956,7 +1957,7 @@ static BOOL read_data( struct request *request, void *buffer, DWORD size, DWORD
     {
         if (!(count = get_available_data( request )))
         {
-            if (!refill_buffer( request, async )) goto done;
+            if (!(ret = refill_buffer( request, async ))) goto done;
             if (!(count = get_available_data( request ))) goto done;
         }
         count = min( count, size );
@@ -1968,15 +1969,25 @@ static BOOL read_data( struct request *request, void *buffer, DWORD size, DWORD
         request->content_read += count;
         if (end_of_read_data( request )) goto done;
     }
-    if (request->read_chunked && !request->read_chunked_size) refill_buffer( request, async );
+    if (request->read_chunked && !request->read_chunked_size) ret = refill_buffer( request, async );
 
 done:
     TRACE( "retrieved %u bytes (%u/%u)\n", bytes_read, request->content_read, request->content_length );
+    if (async)
+    {
+        if (ret) send_callback( &request->hdr, WINHTTP_CALLBACK_STATUS_READ_COMPLETE, buffer, bytes_read );
+        else
+        {
+            WINHTTP_ASYNC_RESULT result;
+            result.dwResult = API_READ_DATA;
+            result.dwError  = GetLastError();
+            send_callback( &request->hdr, WINHTTP_CALLBACK_STATUS_REQUEST_ERROR, &result, sizeof(result) );
+        }
+    }
 
-    if (async) send_callback( &request->hdr, WINHTTP_CALLBACK_STATUS_READ_COMPLETE, buffer, bytes_read );
-    if (read) *read = bytes_read;
+    if (ret && read) *read = bytes_read;
     if (end_of_read_data( request )) finished_reading( request );
-    return TRUE;
+    return ret;
 }
 
 /* read any content returned by the server so that the connection can be reused */
@@ -2781,7 +2792,7 @@ static BOOL receive_response( struct request *request, BOOL async )
     }
 
     netconn_set_timeout( request->netconn, FALSE, request->receive_timeout );
-    if (request->content_length) refill_buffer( request, FALSE );
+    if (request->content_length) ret = refill_buffer( request, FALSE );
 
     if (async)
     {
@@ -2847,25 +2858,35 @@ BOOL WINAPI WinHttpReceiveResponse( HINTERNET hrequest, LPVOID reserved )
 static BOOL query_data_available( struct request *request, DWORD *available, BOOL async )
 {
     DWORD count = 0;
+    BOOL ret = TRUE;
 
     if (end_of_read_data( request )) goto done;
 
     count = get_available_data( request );
-    if (!request->read_chunked && request->netconn)
-        count += netconn_query_data_available( request->netconn );
+    if (!request->read_chunked && request->netconn) count += netconn_query_data_available( request->netconn );
     if (!count)
     {
-        refill_buffer( request, async );
+        if (!(ret = refill_buffer( request, async ))) goto done;
         count = get_available_data( request );
-        if (!request->read_chunked && request->netconn)
-            count += netconn_query_data_available( request->netconn );
+        if (!request->read_chunked && request->netconn) count += netconn_query_data_available( request->netconn );
     }
 
 done:
-    if (async) send_callback( &request->hdr, WINHTTP_CALLBACK_STATUS_DATA_AVAILABLE, &count, sizeof(count) );
     TRACE("%u bytes available\n", count);
-    if (available) *available = count;
-    return TRUE;
+    if (async)
+    {
+        if (ret) send_callback( &request->hdr, WINHTTP_CALLBACK_STATUS_DATA_AVAILABLE, &count, sizeof(count) );
+        else
+        {
+            WINHTTP_ASYNC_RESULT result;
+            result.dwResult = API_QUERY_DATA_AVAILABLE;
+            result.dwError  = GetLastError();
+            send_callback( &request->hdr, WINHTTP_CALLBACK_STATUS_REQUEST_ERROR, &result, sizeof(result) );
+        }
+    }
+
+    if (ret && available) *available = count;
+    return ret;
 }
 
 static void task_query_data_available( struct task_header *task )
-- 
2.11.0




More information about the wine-devel mailing list