Jacek Caban : urlmon: Fixed report_data for recursive calls.

Alexandre Julliard julliard at winehq.org
Fri Aug 21 09:31:51 CDT 2009


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

Author: Jacek Caban <jacek at 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);
 }
 




More information about the wine-cvs mailing list