ole32: Change the base IStorage filename to a pointer type.

The maximum size of the name returned by Stat() on a top-level storage has
nothing to do with DIRENTRY_NAME_BUFFER_LEN. Windows can return longer names
and probably has a limit of MAX_PATH. Also, Stat always returns an absolute
pathname, so we don't need a special case in StgOpenStorage.
This commit is contained in:
Vincent Povirk 2009-12-07 14:53:36 -06:00 committed by Alexandre Julliard
parent efbd38ae84
commit 9300a92ccc
3 changed files with 80 additions and 10 deletions

View File

@ -2242,6 +2242,7 @@ static HRESULT StorageImpl_Construct(
HRESULT hr = S_OK;
DirEntry currentEntry;
DirRef currentEntryRef;
WCHAR fullpath[MAX_PATH];
if ( FAILED( validateSTGM(openFlags) ))
return STG_E_INVALIDFLAG;
@ -2272,15 +2273,19 @@ static HRESULT StorageImpl_Construct(
This->hFile = hFile;
if(pwcsName) {
if (!GetFullPathNameW(pwcsName, MAX_PATH, fullpath, NULL))
{
lstrcpynW(fullpath, pwcsName, MAX_PATH);
}
This->pwcsName = HeapAlloc(GetProcessHeap(), 0,
(lstrlenW(pwcsName)+1)*sizeof(WCHAR));
(lstrlenW(fullpath)+1)*sizeof(WCHAR));
if (!This->pwcsName)
{
hr = STG_E_INSUFFICIENTMEMORY;
goto end;
}
strcpyW(This->pwcsName, pwcsName);
lstrcpynW(This->base.filename, pwcsName, DIRENTRY_NAME_BUFFER_LEN);
strcpyW(This->pwcsName, fullpath);
This->base.filename = This->pwcsName;
}
/*
@ -5857,7 +5862,6 @@ HRESULT WINAPI StgOpenStorage(
HANDLE hFile = 0;
DWORD shareMode;
DWORD accessMode;
WCHAR fullname[MAX_PATH];
TRACE("(%s, %p, %x, %p, %d, %p)\n",
debugstr_w(pwcsName), pstgPriority, grfMode,
@ -6011,11 +6015,6 @@ HRESULT WINAPI StgOpenStorage(
goto end;
}
/* prepare the file name string given in lieu of the root property name */
GetFullPathNameW(pwcsName, MAX_PATH, fullname, NULL);
memcpy(newStorage->base.filename, fullname, DIRENTRY_NAME_BUFFER_LEN);
newStorage->base.filename[DIRENTRY_NAME_BUFFER_LEN-1] = '\0';
/*
* Get an "out" pointer for the caller.
*/

View File

@ -239,7 +239,7 @@ struct StorageBaseImpl
DWORD stateBits;
/* If set, this overrides the root storage name returned by IStorage_Stat */
WCHAR filename[DIRENTRY_NAME_BUFFER_LEN];
LPCWSTR filename;
BOOL create; /* Was the storage created or opened.
The behaviour of STGM_SIMPLE depends on this */

View File

@ -2466,6 +2466,76 @@ static void test_rename(void)
ok( r == TRUE, "deleted file\n");
}
static void test_toplevel_stat(void)
{
IStorage *stg = NULL;
HRESULT r;
STATSTG stat;
WCHAR prev_dir[MAX_PATH];
WCHAR temp[MAX_PATH];
WCHAR full_path[MAX_PATH];
LPWSTR rel_path;
DeleteFileA(filenameA);
r = StgCreateDocfile( filename, STGM_CREATE | STGM_SHARE_EXCLUSIVE |
STGM_READWRITE |STGM_TRANSACTED, 0, &stg);
ok(r==S_OK, "StgCreateDocfile failed\n");
r = IStorage_Stat( stg, &stat, STATFLAG_DEFAULT );
ok(!lstrcmpW(stat.pwcsName, filename), "expected %s, got %s\n",
wine_dbgstr_w(filename), wine_dbgstr_w(stat.pwcsName));
CoTaskMemFree(stat.pwcsName);
IStorage_Release( stg );
r = StgOpenStorage( filename, NULL, STGM_SHARE_EXCLUSIVE|STGM_READWRITE, NULL, 0, &stg);
ok(r==S_OK, "StgOpenStorage failed with error 0x%08x\n", r);
r = IStorage_Stat( stg, &stat, STATFLAG_DEFAULT );
ok(!lstrcmpW(stat.pwcsName, filename), "expected %s, got %s\n",
wine_dbgstr_w(filename), wine_dbgstr_w(stat.pwcsName));
CoTaskMemFree(stat.pwcsName);
IStorage_Release( stg );
DeleteFileA(filenameA);
/* Stat always returns the full path, even for files opened with a relative path. */
GetCurrentDirectoryW(MAX_PATH, prev_dir);
GetTempPathW(MAX_PATH, temp);
SetCurrentDirectoryW(temp);
GetFullPathNameW(filename, MAX_PATH, full_path, &rel_path);
r = StgCreateDocfile( rel_path, STGM_CREATE | STGM_SHARE_EXCLUSIVE |
STGM_READWRITE |STGM_TRANSACTED, 0, &stg);
ok(r==S_OK, "StgCreateDocfile failed\n");
r = IStorage_Stat( stg, &stat, STATFLAG_DEFAULT );
ok(!lstrcmpW(stat.pwcsName, filename), "expected %s, got %s\n",
wine_dbgstr_w(filename), wine_dbgstr_w(stat.pwcsName));
CoTaskMemFree(stat.pwcsName);
IStorage_Release( stg );
r = StgOpenStorage( rel_path, NULL, STGM_SHARE_EXCLUSIVE|STGM_READWRITE, NULL, 0, &stg);
ok(r==S_OK, "StgOpenStorage failed with error 0x%08x\n", r);
r = IStorage_Stat( stg, &stat, STATFLAG_DEFAULT );
ok(!lstrcmpW(stat.pwcsName, filename), "expected %s, got %s\n",
wine_dbgstr_w(filename), wine_dbgstr_w(stat.pwcsName));
CoTaskMemFree(stat.pwcsName);
IStorage_Release( stg );
SetCurrentDirectoryW(prev_dir);
DeleteFileA(filenameA);
}
START_TEST(storage32)
{
CHAR temp[MAX_PATH];
@ -2503,4 +2573,5 @@ START_TEST(storage32)
test_copyto_iidexclusions_storage();
test_copyto_iidexclusions_stream();
test_rename();
test_toplevel_stat();
}