Module: wine Branch: master Commit: 3d03ccf2530903a84eab4696f70e36cb51782a85 URL: http://source.winehq.org/git/wine.git/?a=commit;h=3d03ccf2530903a84eab4696f7...
Author: Jacek Caban jacek@codeweavers.com Date: Fri Aug 21 00:14:59 2009 +0200
urlmon: Fixed report_data for recursive calls.
---
dlls/urlmon/bindprot.c | 45 ++++++++++++++++++++++++++++++--------------- 1 files changed, 30 insertions(+), 15 deletions(-)
diff --git a/dlls/urlmon/bindprot.c b/dlls/urlmon/bindprot.c index 14573a8..63f2375 100644 --- a/dlls/urlmon/bindprot.c +++ b/dlls/urlmon/bindprot.c @@ -703,7 +703,7 @@ static HRESULT WINAPI ProtocolHandler_Read(IInternetProtocol *iface, void *pv,
TRACE("(%p)->(%p %u %p)\n", This, pv, cb, pcbRead);
- if(This->buf) { + if(This->buf_size) { read = min(cb, This->buf_size); memcpy(pv, This->buf, read);
@@ -1028,37 +1028,52 @@ static HRESULT report_data(BindProtocol *This, DWORD bscf, ULONG progress, ULONG return S_OK;
if((This->pi & PI_MIMEVERIFICATION) && !This->reported_mime) { + BYTE buf[BUFFER_SIZE]; DWORD read = 0; LPWSTR mime; HRESULT hres;
- if(!This->buf) { - This->buf = heap_alloc(BUFFER_SIZE); - if(!This->buf) - return E_OUTOFMEMORY; - } - do { read = 0; - hres = IInternetProtocol_Read(This->protocol, This->buf+This->buf_size, - BUFFER_SIZE-This->buf_size, &read); + hres = IInternetProtocol_Read(This->protocol, buf, + sizeof(buf)-This->buf_size, &read); if(FAILED(hres) && hres != E_PENDING) return hres; + + if(!This->buf) { + This->buf = heap_alloc(BUFFER_SIZE); + if(!This->buf) + return E_OUTOFMEMORY; + }else if(read + This->buf_size > BUFFER_SIZE) { + BYTE *tmp; + + tmp = heap_realloc(This->buf, read+This->buf_size); + if(!tmp) + return E_OUTOFMEMORY; + This->buf = tmp; + } + + memcpy(This->buf+This->buf_size, buf, read); This->buf_size += read; }while(This->buf_size < MIME_TEST_SIZE && hres == S_OK);
if(This->buf_size < MIME_TEST_SIZE && hres != S_FALSE) return S_OK;
- hres = FindMimeFromData(NULL, This->url, This->buf, min(This->buf_size, MIME_TEST_SIZE), - This->mime, 0, &mime, 0); - if(FAILED(hres)) - return hres; + if(!This->reported_mime) { + hres = FindMimeFromData(NULL, This->url, This->buf, min(This->buf_size, MIME_TEST_SIZE), + This->mime, 0, &mime, 0); + if(FAILED(hres)) + return hres;
- mime_available(This, mime, TRUE); - CoTaskMemFree(mime); + mime_available(This, mime, TRUE); + CoTaskMemFree(mime); + } }
+ if(!This->protocol_sink) + return S_OK; + return IInternetProtocolSink_ReportData(This->protocol_sink, bscf, progress, progress_max); }