From c81407f22d07584ec2c3d6c0b4ba87e36b3fc49d Mon Sep 17 00:00:00 2001 From: Alexander Morozov Date: Fri, 24 Sep 2010 19:28:59 +0400 Subject: [PATCH] ole32: Fix up flags check (eterbug #41). --- dlls/ole32/storage32.c | 25 ++++++++++++++++++++----- 1 file changed, 20 insertions(+), 5 deletions(-) diff --git a/dlls/ole32/storage32.c b/dlls/ole32/storage32.c index 046ceb27ae..da414234ef 100644 --- a/dlls/ole32/storage32.c +++ b/dlls/ole32/storage32.c @@ -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 */ -- 2.33.8