From 3f83b788d4663d321af6de4ee5885b645e5ad485 Mon Sep 17 00:00:00 2001 From: Vincent Povirk Date: Thu, 11 Jun 2015 16:37:25 -0500 Subject: [PATCH] ole32: Fix storage locking for read-only exclusive mode. --- dlls/ole32/storage32.c | 8 ++++++++ dlls/ole32/tests/storage32.c | 4 ++-- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/dlls/ole32/storage32.c b/dlls/ole32/storage32.c index bde8481e334..b1bad381c1f 100644 --- a/dlls/ole32/storage32.c +++ b/dlls/ole32/storage32.c @@ -5031,6 +5031,14 @@ static HRESULT StorageImpl_GrabLocks(StorageImpl *This, DWORD openFlags) if (SUCCEEDED(hr) && (share_mode == STGM_SHARE_DENY_WRITE || share_mode == STGM_SHARE_EXCLUSIVE)) hr = StorageImpl_CheckLockRange(This, RANGELOCK_WRITE_FIRST, RANGELOCK_WRITE_LAST, STG_E_LOCKVIOLATION); + if (SUCCEEDED(hr) && STGM_ACCESS_MODE(openFlags) == STGM_READ && share_mode == STGM_SHARE_EXCLUSIVE) + { + hr = StorageImpl_CheckLockRange(This, 0, RANGELOCK_CHECKLOCKS-1, STG_E_LOCKVIOLATION); + + if (SUCCEEDED(hr)) + hr = StorageImpl_CheckLockRange(This, RANGELOCK_CHECKLOCKS+1, RANGELOCK_LAST, STG_E_LOCKVIOLATION); + } + /* Then grab our locks. */ if (SUCCEEDED(hr) && (openFlags & STGM_PRIORITY) == STGM_PRIORITY) { diff --git a/dlls/ole32/tests/storage32.c b/dlls/ole32/tests/storage32.c index e83ae2af305..0113d1b3bb7 100644 --- a/dlls/ole32/tests/storage32.c +++ b/dlls/ole32/tests/storage32.c @@ -3185,8 +3185,8 @@ static const struct lock_test lock_tests[] = { { STGM_READWRITE|STGM_TRANSACTED|STGM_SHARE_DENY_WRITE, FALSE, GENERIC_READ|GENERIC_WRITE, FILE_SHARE_READ, rwdw_locked_bytes, rwdw_fail_ranges, FALSE }, { STGM_READ|STGM_SHARE_DENY_WRITE, FALSE, GENERIC_READ, FILE_SHARE_READ, no_locked_bytes, dw_fail_ranges, TRUE }, { STGM_READ|STGM_TRANSACTED, FALSE, GENERIC_READ, FILE_SHARE_READ|FILE_SHARE_WRITE, tr_locked_bytes, tr_fail_ranges, FALSE }, - { STGM_READ|STGM_SHARE_EXCLUSIVE, FALSE, GENERIC_READ, FILE_SHARE_READ, roex_locked_bytes, roex_fail_ranges, TRUE }, - { STGM_READ|STGM_SHARE_EXCLUSIVE|STGM_TRANSACTED, FALSE, GENERIC_READ, FILE_SHARE_READ, roex_locked_bytes, roex_fail_ranges, TRUE }, + { STGM_READ|STGM_SHARE_EXCLUSIVE, FALSE, GENERIC_READ, FILE_SHARE_READ, roex_locked_bytes, roex_fail_ranges, FALSE }, + { STGM_READ|STGM_SHARE_EXCLUSIVE|STGM_TRANSACTED, FALSE, GENERIC_READ, FILE_SHARE_READ, roex_locked_bytes, roex_fail_ranges, FALSE }, }; static BOOL can_open(LPCWSTR filename, DWORD access, DWORD sharing)