Module: wine Branch: master Commit: dd61ebe6cf93f6d6ea270f64793a1348b3ce44d0 URL: http://source.winehq.org/git/wine.git/?a=commit;h=dd61ebe6cf93f6d6ea270f6479...
Author: Jacek Caban jacek@codeweavers.com Date: Thu May 26 13:34:11 2011 +0200
urlmon: Avoid multiple InternetQueryDataAvailable calls in pending state.
---
dlls/urlmon/protocol.c | 44 ++++++++++++++++++++++---------------------- 1 files changed, 22 insertions(+), 22 deletions(-)
diff --git a/dlls/urlmon/protocol.c b/dlls/urlmon/protocol.c index 1b8b5e3..326564b 100644 --- a/dlls/urlmon/protocol.c +++ b/dlls/urlmon/protocol.c @@ -335,7 +335,7 @@ HRESULT protocol_continue(Protocol *protocol, PROTOCOLDATA *data) protocol->flags |= FLAG_FIRST_CONTINUE_COMPLETE; }
- if(data->pData >= (LPVOID)BINDSTATUS_DOWNLOADINGDATA) { + if(data->pData >= (LPVOID)BINDSTATUS_DOWNLOADINGDATA && !protocol->available_bytes) { BOOL res;
/* InternetQueryDataAvailable may immediately fork and perform its asynchronous @@ -367,33 +367,33 @@ HRESULT protocol_read(Protocol *protocol, void *buf, ULONG size, ULONG *read_ret return S_FALSE; }
- if(!(protocol->flags & FLAG_REQUEST_COMPLETE)) { + if(!(protocol->flags & FLAG_REQUEST_COMPLETE) || !protocol->available_bytes) { *read_ret = 0; return E_PENDING; }
- while(read < size) { - if(protocol->available_bytes) { - ULONG len; + while(read < size && protocol->available_bytes) { + ULONG len;
- res = InternetReadFile(protocol->request, ((BYTE *)buf)+read, - protocol->available_bytes > size-read ? size-read : protocol->available_bytes, &len); - if(!res) { - WARN("InternetReadFile failed: %d\n", GetLastError()); - hres = INET_E_DOWNLOAD_FAILURE; - report_result(protocol, hres); - break; - } + res = InternetReadFile(protocol->request, ((BYTE *)buf)+read, + protocol->available_bytes > size-read ? size-read : protocol->available_bytes, &len); + if(!res) { + WARN("InternetReadFile failed: %d\n", GetLastError()); + hres = INET_E_DOWNLOAD_FAILURE; + report_result(protocol, hres); + break; + }
- if(!len) { - all_data_read(protocol); - break; - } + if(!len) { + all_data_read(protocol); + break; + } + + read += len; + protocol->current_position += len; + protocol->available_bytes -= len;
- read += len; - protocol->current_position += len; - protocol->available_bytes -= len; - }else { + if(!protocol->available_bytes) { /* 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 */