Dmitry Timoshkov : windowscodecs: Handle short reads in the metadata handler.

Alexandre Julliard julliard at winehq.org
Mon Aug 13 13:21:17 CDT 2012


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

Author: Dmitry Timoshkov <dmitry at baikal.ru>
Date:   Mon Aug  6 11:07:49 2012 +0900

windowscodecs: Handle short reads in the metadata handler.

---

 dlls/windowscodecs/metadatahandler.c |   63 ++++++++++++++++++++-------------
 1 files changed, 38 insertions(+), 25 deletions(-)

diff --git a/dlls/windowscodecs/metadatahandler.c b/dlls/windowscodecs/metadatahandler.c
index 042d6ae..084facf 100644
--- a/dlls/windowscodecs/metadatahandler.c
+++ b/dlls/windowscodecs/metadatahandler.c
@@ -681,7 +681,8 @@ static HRESULT LoadUnknownMetadata(IStream *input, const GUID *preferred_vendor,
     if (!data) return E_OUTOFMEMORY;
 
     hr = IStream_Read(input, data, stat.cbSize.QuadPart, &bytesread);
-    if (FAILED(hr))
+    if (bytesread != stat.cbSize.QuadPart) hr = E_FAIL;
+    if (hr != S_OK)
     {
         HeapFree(GetProcessHeap(), 0, data);
         return hr;
@@ -770,7 +771,7 @@ static int tag_to_vt(SHORT tag)
 static HRESULT load_IFD_entry(IStream *input, const struct IFD_entry *entry,
                               MetadataItem *item, BOOL native_byte_order)
 {
-    ULONG count, value, i;
+    ULONG count, value, i, bytesread;
     SHORT type;
     LARGE_INTEGER pos;
     HRESULT hr;
@@ -822,8 +823,9 @@ static HRESULT load_IFD_entry(IStream *input, const struct IFD_entry *entry,
             HeapFree(GetProcessHeap(), 0, item->value.u.caub.pElems);
             return hr;
         }
-        hr = IStream_Read(input, item->value.u.caub.pElems, count, NULL);
-        if (FAILED(hr))
+        hr = IStream_Read(input, item->value.u.caub.pElems, count, &bytesread);
+        if (bytesread != count) hr = E_FAIL;
+        if (hr != S_OK)
         {
             HeapFree(GetProcessHeap(), 0, item->value.u.caub.pElems);
             return hr;
@@ -866,8 +868,9 @@ static HRESULT load_IFD_entry(IStream *input, const struct IFD_entry *entry,
             HeapFree(GetProcessHeap(), 0, item->value.u.caui.pElems);
             return hr;
         }
-        hr = IStream_Read(input, item->value.u.caui.pElems, count * 2, NULL);
-        if (FAILED(hr))
+        hr = IStream_Read(input, item->value.u.caui.pElems, count * 2, &bytesread);
+        if (bytesread != count * 2) hr = E_FAIL;
+        if (hr != S_OK)
         {
             HeapFree(GetProcessHeap(), 0, item->value.u.caui.pElems);
             return hr;
@@ -898,8 +901,9 @@ static HRESULT load_IFD_entry(IStream *input, const struct IFD_entry *entry,
             HeapFree(GetProcessHeap(), 0, item->value.u.caul.pElems);
             return hr;
         }
-        hr = IStream_Read(input, item->value.u.caul.pElems, count * 4, NULL);
-        if (FAILED(hr))
+        hr = IStream_Read(input, item->value.u.caul.pElems, count * 4, &bytesread);
+        if (bytesread != count * 4) hr = E_FAIL;
+        if (hr != S_OK)
         {
             HeapFree(GetProcessHeap(), 0, item->value.u.caul.pElems);
             return hr;
@@ -925,8 +929,9 @@ static HRESULT load_IFD_entry(IStream *input, const struct IFD_entry *entry,
             hr = IStream_Seek(input, pos, SEEK_SET, NULL);
             if (FAILED(hr)) return hr;
 
-            hr = IStream_Read(input, &ull, sizeof(ull), NULL);
-            if (FAILED(hr)) return hr;
+            hr = IStream_Read(input, &ull, sizeof(ull), &bytesread);
+            if (bytesread != sizeof(ull)) hr = E_FAIL;
+            if (hr != S_OK) return hr;
 
             item->value.u.uhVal.QuadPart = ull;
 
@@ -953,8 +958,9 @@ static HRESULT load_IFD_entry(IStream *input, const struct IFD_entry *entry,
                 HeapFree(GetProcessHeap(), 0, item->value.u.cauh.pElems);
                 return hr;
             }
-            hr = IStream_Read(input, item->value.u.cauh.pElems, count * 8, NULL);
-            if (FAILED(hr))
+            hr = IStream_Read(input, item->value.u.cauh.pElems, count * 8, &bytesread);
+            if (bytesread != count * 8) hr = E_FAIL;
+            if (hr != S_OK)
             {
                 HeapFree(GetProcessHeap(), 0, item->value.u.cauh.pElems);
                 return hr;
@@ -990,8 +996,9 @@ static HRESULT load_IFD_entry(IStream *input, const struct IFD_entry *entry,
             HeapFree(GetProcessHeap(), 0, item->value.u.pszVal);
             return hr;
         }
-        hr = IStream_Read(input, item->value.u.pszVal, count, NULL);
-        if (FAILED(hr))
+        hr = IStream_Read(input, item->value.u.pszVal, count, &bytesread);
+        if (bytesread != count) hr = E_FAIL;
+        if (hr != S_OK)
         {
             HeapFree(GetProcessHeap(), 0, item->value.u.pszVal);
             return hr;
@@ -1025,8 +1032,9 @@ static HRESULT load_IFD_entry(IStream *input, const struct IFD_entry *entry,
             HeapFree(GetProcessHeap(), 0, item->value.u.blob.pBlobData);
             return hr;
         }
-        hr = IStream_Read(input, item->value.u.blob.pBlobData, count, NULL);
-        if (FAILED(hr))
+        hr = IStream_Read(input, item->value.u.blob.pBlobData, count, &bytesread);
+        if (bytesread != count) hr = E_FAIL;
+        if (hr != S_OK)
         {
             HeapFree(GetProcessHeap(), 0, item->value.u.blob.pBlobData);
             return hr;
@@ -1047,6 +1055,7 @@ static HRESULT LoadIfdMetadata(IStream *input, const GUID *preferred_vendor,
     USHORT count, i;
     struct IFD_entry *entry;
     BOOL native_byte_order = TRUE;
+    ULONG bytesread;
 
     TRACE("\n");
 
@@ -1057,16 +1066,18 @@ static HRESULT LoadIfdMetadata(IStream *input, const GUID *preferred_vendor,
 #endif
         native_byte_order = FALSE;
 
-    hr = IStream_Read(input, &count, sizeof(count), NULL);
-    if (FAILED(hr)) return hr;
+    hr = IStream_Read(input, &count, sizeof(count), &bytesread);
+    if (bytesread != sizeof(count)) hr = E_FAIL;
+    if (hr != S_OK) return hr;
 
     SWAP_USHORT(count);
 
     entry = HeapAlloc(GetProcessHeap(), 0, count * sizeof(*entry));
     if (!entry) return E_OUTOFMEMORY;
 
-    hr = IStream_Read(input, entry, count * sizeof(*entry), NULL);
-    if (FAILED(hr))
+    hr = IStream_Read(input, entry, count * sizeof(*entry), &bytesread);
+    if (bytesread != count * sizeof(*entry)) hr = E_FAIL;
+    if (hr != S_OK)
     {
         HeapFree(GetProcessHeap(), 0, entry);
         return hr;
@@ -1079,8 +1090,9 @@ static HRESULT LoadIfdMetadata(IStream *input, const GUID *preferred_vendor,
         LARGE_INTEGER pos;
         USHORT next_ifd_count;
 
-        hr = IStream_Read(input, &next_ifd_offset, sizeof(next_ifd_offset), NULL);
-        if (FAILED(hr)) break;
+        hr = IStream_Read(input, &next_ifd_offset, sizeof(next_ifd_offset), &bytesread);
+        if (bytesread != sizeof(next_ifd_offset)) hr = E_FAIL;
+        if (hr != S_OK) break;
 
         SWAP_ULONG(next_ifd_offset);
         if (!next_ifd_offset) break;
@@ -1089,8 +1101,9 @@ static HRESULT LoadIfdMetadata(IStream *input, const GUID *preferred_vendor,
         hr = IStream_Seek(input, pos, SEEK_SET, NULL);
         if (FAILED(hr)) break;
 
-        hr = IStream_Read(input, &next_ifd_count, sizeof(next_ifd_count), NULL);
-        if (FAILED(hr)) break;
+        hr = IStream_Read(input, &next_ifd_count, sizeof(next_ifd_count), &bytesread);
+        if (bytesread != sizeof(next_ifd_count)) hr = E_FAIL;
+        if (hr != S_OK) break;
 
         SWAP_USHORT(next_ifd_count);
 
@@ -1099,7 +1112,7 @@ static HRESULT LoadIfdMetadata(IStream *input, const GUID *preferred_vendor,
         if (FAILED(hr)) break;
     }
 
-    if (FAILED(hr) || i == 4096)
+    if (hr != S_OK || i == 4096)
     {
         HeapFree(GetProcessHeap(), 0, entry);
         return WINCODEC_ERR_BADMETADATAHEADER;




More information about the wine-cvs mailing list