From 101de22a1a09643c43cd01e281a9fdf926b03535 Mon Sep 17 00:00:00 2001 From: Vincent Povirk Date: Wed, 25 Aug 2010 14:55:21 -0500 Subject: [PATCH] ole32: Flush before returning from any storage API call that writes. --- dlls/ole32/stg_stream.c | 7 +++++++ dlls/ole32/storage32.c | 12 ++++++++++-- 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/dlls/ole32/stg_stream.c b/dlls/ole32/stg_stream.c index 1fdb963f56b..b09ba5b854b 100644 --- a/dlls/ole32/stg_stream.c +++ b/dlls/ole32/stg_stream.c @@ -295,6 +295,9 @@ static HRESULT WINAPI StgStreamImpl_Write( */ This->currentPosition.u.LowPart += *pcbWritten; + if (SUCCEEDED(res)) + res = StorageBaseImpl_Flush(This->parentStorage); + TRACE("<-- S_OK, written %u\n", *pcbWritten); return res; } @@ -417,6 +420,10 @@ static HRESULT WINAPI StgStreamImpl_SetSize( } hr = StorageBaseImpl_StreamSetSize(This->parentStorage, This->dirEntry, libNewSize); + + if (SUCCEEDED(hr)) + hr = StorageBaseImpl_Flush(This->parentStorage); + return hr; } diff --git a/dlls/ole32/storage32.c b/dlls/ole32/storage32.c index 185b8b0d764..21cac5854b3 100644 --- a/dlls/ole32/storage32.c +++ b/dlls/ole32/storage32.c @@ -856,7 +856,7 @@ static HRESULT WINAPI StorageBaseImpl_RenameElement( return STG_E_FILENOTFOUND; } - return S_OK; + return StorageBaseImpl_Flush(This); } /************************************************************************ @@ -1011,7 +1011,7 @@ static HRESULT WINAPI StorageBaseImpl_CreateStream( return STG_E_INSUFFICIENTMEMORY; } - return S_OK; + return StorageBaseImpl_Flush(This); } /************************************************************************ @@ -1047,6 +1047,9 @@ static HRESULT WINAPI StorageBaseImpl_SetClass( ¤tEntry); } + if (SUCCEEDED(hRes)) + hRes = StorageBaseImpl_Flush(This); + return hRes; } @@ -1203,6 +1206,8 @@ static HRESULT WINAPI StorageBaseImpl_CreateStorage( return hr; } + if (SUCCEEDED(hr)) + hr = StorageBaseImpl_Flush(This); return S_OK; } @@ -1916,6 +1921,9 @@ static HRESULT WINAPI StorageBaseImpl_DestroyElement( if (SUCCEEDED(hr)) StorageBaseImpl_DestroyDirEntry(This, entryToDeleteRef); + if (SUCCEEDED(hr)) + hr = StorageBaseImpl_Flush(This); + return hr; }