Misha Koshelev : urlmon: Fix timing issue with FLAG_REQUEST_COMPLETE and InternetQueryDataAvailable in HttpProtocol_Continue .

Alexandre Julliard julliard at wine.codeweavers.com
Tue Aug 14 07:12:53 CDT 2007


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

Author: Misha Koshelev <mk144210 at bcm.edu>
Date:   Mon Aug 13 00:24:57 2007 -0500

urlmon: Fix timing issue with FLAG_REQUEST_COMPLETE and InternetQueryDataAvailable in HttpProtocol_Continue.

---

 dlls/urlmon/http.c |   12 +++++++-----
 1 files changed, 7 insertions(+), 5 deletions(-)

diff --git a/dlls/urlmon/http.c b/dlls/urlmon/http.c
index 08d6419..2d1929d 100644
--- a/dlls/urlmon/http.c
+++ b/dlls/urlmon/http.c
@@ -661,20 +661,22 @@ static HRESULT WINAPI HttpProtocol_Continue(IInternetProtocol *iface, PROTOCOLDA
 
     if (pProtocolData->pData >= (LPVOID)BINDSTATUS_DOWNLOADINGDATA)
     {
+        /* InternetQueryDataAvailable may immediately fork and perform its asynchronous
+         * read, so clear the flag _before_ calling so it does not incorrectly get cleared
+         * after the status callback is called */
+        This->flags &= ~FLAG_REQUEST_COMPLETE;
         if (!InternetQueryDataAvailable(This->request, &This->available_bytes, 0, 0))
         {
-            if (GetLastError() == ERROR_IO_PENDING)
-            {
-                This->flags &= ~FLAG_REQUEST_COMPLETE;
-            }
-            else
+            if (GetLastError() != ERROR_IO_PENDING)
             {
+                This->flags |= FLAG_REQUEST_COMPLETE;
                 WARN("InternetQueryDataAvailable failed: %d\n", GetLastError());
                 HTTPPROTOCOL_ReportResult(This, INET_E_DATA_NOT_AVAILABLE);
             }
         }
         else
         {
+            This->flags |= FLAG_REQUEST_COMPLETE;
             HTTPPROTOCOL_ReportData(This);
         }
     }




More information about the wine-cvs mailing list