From 4f405b228d94c79cebc506053c7d892b7e18a7fa Mon Sep 17 00:00:00 2001 From: Misha Koshelev Date: Mon, 13 Aug 2007 00:24:57 -0500 Subject: [PATCH] urlmon: Fix timing issue with FLAG_REQUEST_COMPLETE and InternetQueryDataAvailable in HttpProtocol_Continue. --- dlls/urlmon/http.c | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/dlls/urlmon/http.c b/dlls/urlmon/http.c index 08d6419965d..2d1929db273 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); } } -- 2.11.4.GIT