ole32: Fix up flags check (eterbug #41).
authorAlexander Morozov <amorozov@etersoft.ru>
Fri, 24 Sep 2010 15:28:59 +0000 (19:28 +0400)
committerAlexander Morozov <amorozov@etersoft.ru>
Fri, 24 Sep 2010 16:58:10 +0000 (20:58 +0400)
dlls/ole32/storage32.c

index 046ceb27ae027a826e365eb14d6e54b8194677ad..da414234efada1b0135ee060a0065a29f0547a2a 100644 (file)
@@ -1113,8 +1113,17 @@ static HRESULT WINAPI StorageBaseImpl_CreateStorage(
   /*
    * Check that we're compatible with the parent's storage mode
    */
-  if ( !(This->openFlags & STGM_TRANSACTED) &&
-       STGM_ACCESS_MODE( grfMode ) > STGM_ACCESS_MODE( This->openFlags ) )
+  if (This->openFlags & STGM_TRANSACTED)
+  {
+    if ( (STGM_ACCESS_MODE( grfMode ) != STGM_WRITE &&
+          STGM_SHARE_MODE( grfMode ) == STGM_SHARE_EXCLUSIVE) &&
+         STGM_ACCESS_MODE( This->openFlags ) == STGM_WRITE )
+    {
+      WARN("grfMode %x is not compatible with %x\n", grfMode, This->openFlags);
+      return STG_E_INVALIDFLAG;
+    }
+  }
+  else if ( STGM_ACCESS_MODE( grfMode ) > STGM_ACCESS_MODE( This->openFlags ) )
   {
     WARN("access denied\n");
     return STG_E_ACCESSDENIED;
@@ -1130,8 +1139,8 @@ static HRESULT WINAPI StorageBaseImpl_CreateStorage(
     /*
      * An element with this name already exists
      */
-    if (STGM_CREATE_MODE(grfMode) == STGM_CREATE &&
-        ((This->openFlags & STGM_TRANSACTED) ||
+    if ((This->openFlags & STGM_TRANSACTED) ||
+        (STGM_CREATE_MODE(grfMode) == STGM_CREATE &&
          STGM_ACCESS_MODE(This->openFlags) != STGM_READ))
     {
       hr = IStorage_DestroyElement(iface, pwcsName);
@@ -7679,7 +7688,8 @@ HRESULT WINAPI StgOpenStorageOnILockBytes(
   if ((plkbyt == 0) || (ppstgOpen == 0))
     return STG_E_INVALIDPOINTER;
 
-  if ( FAILED( validateSTGM(grfMode) ))
+  if ( FAILED( validateSTGM(grfMode) ) ||
+       STGM_CREATE_MODE(grfMode) == STGM_CREATE )
     return STG_E_INVALIDFLAG;
 
   *ppstgOpen = 0;
@@ -7945,6 +7955,11 @@ static HRESULT validateSTGM(DWORD stgm)
     return E_FAIL;
   }
 
+  if ( (share == STGM_SHARE_DENY_NONE || share == STGM_SHARE_DENY_READ ||
+        (share == STGM_SHARE_DENY_WRITE && access != STGM_READ)) &&
+       !(stgm & STGM_TRANSACTED) )
+    return E_FAIL;
+
   /*
    * STGM_DIRECT | STGM_TRANSACTED | STGM_SIMPLE
    */