Vincent Povirk : ole32: Write the new data in getFreeProperty and rename the function.
Alexandre Julliard
julliard at winehq.org
Thu Oct 29 11:20:40 CDT 2009
Module: wine
Branch: master
Commit: 37f3f3d92a8854104de0ef6774bc54f4a1400354
URL: http://source.winehq.org/git/wine.git/?a=commit;h=37f3f3d92a8854104de0ef6774bc54f4a1400354
Author: Vincent Povirk <vincent at codeweavers.com>
Date: Wed Oct 28 13:42:42 2009 -0500
ole32: Write the new data in getFreeProperty and rename the function.
This is to avoid calling WriteProperty with an index to a directory entry
that has not yet been reserved in the file. We reserve the entry by writing
the new data to it.
---
dlls/ole32/storage32.c | 73 +++++++++++++++++++----------------------------
1 files changed, 30 insertions(+), 43 deletions(-)
diff --git a/dlls/ole32/storage32.c b/dlls/ole32/storage32.c
index 3e00cf6..89ae657 100644
--- a/dlls/ole32/storage32.c
+++ b/dlls/ole32/storage32.c
@@ -180,8 +180,10 @@ static HRESULT adjustPropertyChain(
* Declaration of the functions used to manipulate StgProperty
*/
-static ULONG getFreeProperty(
- StorageImpl *storage);
+static HRESULT createDirEntry(
+ StorageImpl *storage,
+ const StgProperty *newData,
+ ULONG *index);
static void updatePropertyChain(
StorageImpl *storage,
@@ -757,17 +759,9 @@ static HRESULT WINAPI StorageBaseImpl_RenameElement(
*/
/*
- * Obtain a free property in the property chain
- */
- renamedPropertyIndex = getFreeProperty(This->ancestorStorage);
-
- /*
- * Save the new property into the new property spot
+ * Save the new property into a new property spot
*/
- StorageImpl_WriteProperty(
- This->ancestorStorage,
- renamedPropertyIndex,
- &renamedProperty);
+ createDirEntry(This->ancestorStorage, &renamedProperty, &renamedPropertyIndex);
/*
* Find a spot in the property chain for our newly created property.
@@ -945,17 +939,9 @@ static HRESULT WINAPI StorageBaseImpl_CreateStream(
/* newStreamProperty.propertyUniqueID */
/*
- * Get a free property or create a new one
+ * Save the new property into a new property spot
*/
- newPropertyIndex = getFreeProperty(This->ancestorStorage);
-
- /*
- * Save the new property into the new property spot
- */
- StorageImpl_WriteProperty(
- This->ancestorStorage,
- newPropertyIndex,
- &newStreamProperty);
+ createDirEntry(This->ancestorStorage, &newStreamProperty, &newPropertyIndex);
/*
* Find a spot in the property chain for our newly created property.
@@ -1136,17 +1122,9 @@ static HRESULT WINAPI StorageImpl_CreateStorage(
/* newStorageProperty.propertyUniqueID */
/*
- * Obtain a free property in the property chain
+ * Save the new property into a new property spot
*/
- newPropertyIndex = getFreeProperty(This->base.ancestorStorage);
-
- /*
- * Save the new property into the new property spot
- */
- StorageImpl_WriteProperty(
- This->base.ancestorStorage,
- newPropertyIndex,
- &newProperty);
+ createDirEntry(This->base.ancestorStorage, &newProperty, &newPropertyIndex);
/*
* Find a spot in the property chain for our newly created property.
@@ -1175,24 +1153,26 @@ static HRESULT WINAPI StorageImpl_CreateStorage(
*
* Internal Method
*
- * Get a free property or create a new one.
+ * Reserve a directory entry in the file and initialize it.
*/
-static ULONG getFreeProperty(
- StorageImpl *storage)
+static HRESULT createDirEntry(
+ StorageImpl *storage,
+ const StgProperty *newData,
+ ULONG *index)
{
ULONG currentPropertyIndex = 0;
ULONG newPropertyIndex = PROPERTY_NULL;
- HRESULT readRes = S_OK;
+ HRESULT hr = S_OK;
BYTE currentData[PROPSET_BLOCK_SIZE];
WORD sizeOfNameString;
do
{
- readRes = StorageImpl_ReadRawDirEntry(storage->base.ancestorStorage,
- currentPropertyIndex,
- currentData);
+ hr = StorageImpl_ReadRawDirEntry(storage->base.ancestorStorage,
+ currentPropertyIndex,
+ currentData);
- if (SUCCEEDED(readRes))
+ if (SUCCEEDED(hr))
{
StorageUtl_ReadWord(
currentData,
@@ -1221,7 +1201,7 @@ static ULONG getFreeProperty(
/*
* grow the property chain
*/
- if (!SUCCEEDED(readRes))
+ if (FAILED(hr))
{
BYTE emptyData[PROPSET_BLOCK_SIZE];
ULARGE_INTEGER newSize;
@@ -1258,7 +1238,7 @@ static ULONG getFreeProperty(
lastProperty = storage->bigBlockSize / PROPSET_BLOCK_SIZE * blockCount;
for(
- propertyIndex = newPropertyIndex;
+ propertyIndex = newPropertyIndex + 1;
propertyIndex < lastProperty;
propertyIndex++)
{
@@ -1269,7 +1249,14 @@ static ULONG getFreeProperty(
}
}
- return newPropertyIndex;
+ UpdateRawDirEntry(currentData, newData);
+
+ hr = StorageImpl_WriteRawDirEntry(storage, newPropertyIndex, currentData);
+
+ if (SUCCEEDED(hr))
+ *index = newPropertyIndex;
+
+ return hr;
}
/****************************************************************************
More information about the wine-cvs
mailing list