Fixes for Ole storage
Warren_Baird at cimmetry.com
Warren_Baird at cimmetry.com
Wed Feb 5 17:31:13 CST 2003
ChangeLog:
1. Close file that is associated to the ole storage resource when
it's being released or when it failed to be created.
2. Zero-out the output struture of a IEnumSTATSTG::Next call if the
function returns false like it does on Windows.
3. Added Unix path conversion to DOS-style in StgCreateDocfile and
StgOpenStorage.
Description:
2. The STATSTG output structure in IEnumSTATSTGImpl_Next function must
be zeroed-out cause most of the time the caller won't look that the
return code but rather test if STATSTG->type is zero. It behaves
the same way on Windows.
3. Call GetFullPathNameW on the input path before calling CreateFileW
in StgCreateDocfile and StgOpenStorage to ensure that CreateFileW
gets a DOS-style path.
Warren Baird : Warren_Baird at cimmetry.com
Dave Belanger
diff -ur clean/wine/dlls/ole32/storage32.c wine/dlls/ole32/storage32.c
--- clean/wine/dlls/ole32/storage32.c Thu Jan 30 14:09:53 2003
+++ wine/dlls/ole32/storage32.c Thu Jan 30 15:30:43 2003
@@ -2400,6 +2400,8 @@
if(This->pwcsName)
HeapFree(GetProcessHeap(), 0, This->pwcsName);
+ CloseHandle(This->hFile);
+
BlockChainStream_Destroy(This->smallBlockRootChain);
BlockChainStream_Destroy(This->rootBlockChain);
BlockChainStream_Destroy(This->smallBlockDepotChain);
@@ -3742,6 +3744,12 @@
if (*pceltFetched == celt)
return S_OK;
+ // We must zero-out the output parameter cause most of the
+ // time the caller doesn't look that the return code but
+ // rather test if rgelt->type is zero.
+ // It behaves the same way on Windows.
+ memset(rgelt, 0, sizeof(STATSTG));
+
return S_FALSE;
}
@@ -5419,6 +5427,7 @@
DWORD creationMode;
DWORD fileAttributes;
WCHAR tempFileName[MAX_PATH];
+ WCHAR fullname[MAX_PATH];
TRACE("(%s, %lx, %ld, %p)\n",
debugstr_w(pwcsName), grfMode,
@@ -5486,7 +5495,9 @@
*/
*ppstgOpen = 0;
- hFile = CreateFileW(pwcsName,
+ GetFullPathNameW(pwcsName, MAX_PATH, fullname, NULL);
+
+ hFile = CreateFileW(fullname,
accessMode,
shareMode,
NULL,
@@ -5504,13 +5515,15 @@
*/
newStorage = HeapAlloc(GetProcessHeap(), 0, sizeof(StorageImpl));
- if (newStorage == 0)
- return STG_E_INSUFFICIENTMEMORY;
+ if (newStorage == 0) {
+ CloseHandle(hFile);
+ return STG_E_INSUFFICIENTMEMORY;
+ }
hr = StorageImpl_Construct(
newStorage,
hFile,
- pwcsName,
+ fullname,
NULL,
grfMode,
TRUE,
@@ -5518,6 +5531,7 @@
if (FAILED(hr))
{
+ CloseHandle(hFile);
HeapFree(GetProcessHeap(), 0, newStorage);
return hr;
}
@@ -5585,7 +5599,9 @@
*/
*ppstgOpen = 0;
- hFile = CreateFileW( pwcsName,
+ GetFullPathNameW(pwcsName, MAX_PATH, fullname, NULL);
+
+ hFile = CreateFileW( fullname,
accessMode,
shareMode,
NULL,
@@ -5642,7 +5658,7 @@
hr = StorageImpl_Construct(
newStorage,
hFile,
- pwcsName,
+ fullname,
NULL,
grfMode,
TRUE,
@@ -5659,8 +5675,6 @@
goto end;
}
- /* prepare the file name string given in lieu of the root property name */
- GetFullPathNameW(pwcsName, MAX_PATH, fullname, NULL);
memcpy(newStorage->filename, fullname, PROPERTY_NAME_BUFFER_LEN);
newStorage->filename[PROPERTY_NAME_BUFFER_LEN-1] = '\0';
@@ -5674,6 +5688,11 @@
end:
TRACE("<-- %08lx, IStorage %p\n", hr, ppstgOpen ? *ppstgOpen : NULL);
+
+ if (FAILED(hr)) {
+ CloseHandle(hFile);
+ }
+
return hr;
}
More information about the wine-patches
mailing list