Piotr Caban : ole32: Try to open 1Ole stream before trying to create it in SetConvertStg function.

Alexandre Julliard julliard at winehq.org
Mon Apr 7 13:20:08 CDT 2014


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

Author: Piotr Caban <piotr at codeweavers.com>
Date:   Mon Apr  7 18:55:41 2014 +0200

ole32: Try to open 1Ole stream before trying to create it in SetConvertStg function.

---

 dlls/ole32/storage32.c |   59 ++++++++++++++++++++++++------------------------
 1 file changed, 30 insertions(+), 29 deletions(-)

diff --git a/dlls/ole32/storage32.c b/dlls/ole32/storage32.c
index a6d30ab..8ad3ff9 100644
--- a/dlls/ole32/storage32.c
+++ b/dlls/ole32/storage32.c
@@ -9510,51 +9510,52 @@ HRESULT WINAPI GetConvertStg(IStorage *stg)
  */
 HRESULT WINAPI SetConvertStg(IStorage *storage, BOOL convert)
 {
+    static const WCHAR stream_1oleW[] = {1,'O','l','e',0};
     DWORD flags = convert ? OleStream_Convert : 0;
+    IStream *stream;
+    DWORD header[2];
     HRESULT hr;
 
     TRACE("(%p, %d)\n", storage, convert);
 
-    hr = STORAGE_CreateOleStream(storage, flags);
-    if (hr == STG_E_FILEALREADYEXISTS)
+    hr = IStorage_OpenStream(storage, stream_1oleW, NULL, STGM_READWRITE | STGM_SHARE_EXCLUSIVE, 0, &stream);
+    if (FAILED(hr))
     {
-        static const WCHAR stream_1oleW[] = {1,'O','l','e',0};
-        IStream *stream;
-        DWORD header[2];
+        if (hr != STG_E_FILENOTFOUND)
+            return hr;
+
+        return STORAGE_CreateOleStream(storage, flags);
+    }
 
-        hr = IStorage_OpenStream(storage, stream_1oleW, NULL, STGM_READWRITE | STGM_SHARE_EXCLUSIVE, 0, &stream);
-        if (FAILED(hr)) return hr;
+    hr = IStream_Read(stream, header, sizeof(header), NULL);
+    if (FAILED(hr))
+    {
+        IStream_Release(stream);
+        return hr;
+    }
 
-        hr = IStream_Read(stream, header, sizeof(header), NULL);
+    /* update flag if differs */
+    if ((header[1] ^ flags) & OleStream_Convert)
+    {
+        LARGE_INTEGER pos = {{0}};
+
+        if (header[1] & OleStream_Convert)
+            flags = header[1] & ~OleStream_Convert;
+        else
+            flags = header[1] |  OleStream_Convert;
+
+        pos.QuadPart = sizeof(DWORD);
+        hr = IStream_Seek(stream, pos, STREAM_SEEK_SET, NULL);
         if (FAILED(hr))
         {
             IStream_Release(stream);
             return hr;
         }
 
-        /* update flag if differs */
-        if ((header[1] ^ flags) & OleStream_Convert)
-        {
-            LARGE_INTEGER pos;
-
-            if (header[1] & OleStream_Convert)
-                flags = header[1] & ~OleStream_Convert;
-            else
-                flags = header[1] |  OleStream_Convert;
-
-            pos.QuadPart = sizeof(DWORD);
-            hr = IStream_Seek(stream, pos, STREAM_SEEK_SET, NULL);
-            if (FAILED(hr))
-            {
-                IStream_Release(stream);
-                return hr;
-            }
-
-            hr = IStream_Write(stream, &flags, sizeof(flags), NULL);
-        }
-        IStream_Release(stream);
+        hr = IStream_Write(stream, &flags, sizeof(flags), NULL);
     }
 
+    IStream_Release(stream);
     return hr;
 }
 




More information about the wine-cvs mailing list