From 6b6fb8ec30f220bd8e5b0b94706ea488e2cd1e9f Mon Sep 17 00:00:00 2001 From: Vincent Povirk Date: Wed, 18 Nov 2009 10:22:50 -0600 Subject: [PATCH 3/6] ole32: Always invalidate stream objects when deleting the stream. --- dlls/ole32/storage32.c | 23 ++++++++++++----------- dlls/ole32/tests/storage32.c | 2 +- 2 files changed, 13 insertions(+), 12 deletions(-) diff --git a/dlls/ole32/storage32.c b/dlls/ole32/storage32.c index df0305d..96e3e00 100644 --- a/dlls/ole32/storage32.c +++ b/dlls/ole32/storage32.c @@ -823,17 +823,6 @@ static HRESULT WINAPI StorageBaseImpl_CreateStream( */ if (STGM_CREATE_MODE(grfMode) == STGM_CREATE) { - StgStreamImpl *strm; - - LIST_FOR_EACH_ENTRY(strm, &This->strmHead, StgStreamImpl, StrmListEntry) - { - if (strm->dirEntry == currentEntryRef) - { - TRACE("Stream deleted %p\n", strm); - strm->parentStorage = NULL; - list_remove(&strm->StrmListEntry); - } - } IStorage_DestroyElement(iface, pwcsName); } else @@ -1914,6 +1903,18 @@ static HRESULT deleteStreamContents( IStream *pis; HRESULT hr; ULARGE_INTEGER size; + StgStreamImpl *strm; + + /* Invalidate any open stream objects. */ + LIST_FOR_EACH_ENTRY(strm, &parentStorage->strmHead, StgStreamImpl, StrmListEntry) + { + if (strm->dirEntry == indexToDelete) + { + TRACE("Stream deleted %p\n", strm); + strm->parentStorage = NULL; + list_remove(&strm->StrmListEntry); + } + } size.u.HighPart = 0; size.u.LowPart = 0; diff --git a/dlls/ole32/tests/storage32.c b/dlls/ole32/tests/storage32.c index b908ea5..8fa300f 100644 --- a/dlls/ole32/tests/storage32.c +++ b/dlls/ole32/tests/storage32.c @@ -1121,7 +1121,7 @@ static void test_substorage_share(void) ok(r==S_OK, "IStorage->DestroyElement failed, hr=%08x\n", r); r = IStream_Write(stm, "this shouldn't work\n", 20, NULL); - todo_wine ok(r==STG_E_REVERTED, "IStream_Write should fail %08x\n", r); + ok(r==STG_E_REVERTED, "IStream_Write should fail %08x\n", r); IStorage_Release(stm); } -- 1.6.3.3