comdlg32: Correctly handle filters with invalid extensions in Save As dialogs.

This commit is contained in:
Alex Henrie 2012-01-24 14:34:43 -07:00 committed by Alexandre Julliard
parent 02b12e1117
commit f0b274bada
2 changed files with 15 additions and 11 deletions

View File

@ -2549,24 +2549,27 @@ BOOL FILEDLG95_OnOpen(HWND hwnd)
if (lpstrFilter != (LPWSTR)CB_ERR) /* control is not empty */ if (lpstrFilter != (LPWSTR)CB_ERR) /* control is not empty */
{ {
WCHAR* filterAtSemicolon; WCHAR* filterSearchIndex;
filterExt = HeapAlloc(GetProcessHeap(), 0, lstrlenW(lpstrFilter) * sizeof(WCHAR) + sizeof(WCHAR)); filterExt = HeapAlloc(GetProcessHeap(), 0, (lstrlenW(lpstrFilter) + 1) * sizeof(WCHAR));
strcpyW(filterExt, lpstrFilter); strcpyW(filterExt, lpstrFilter);
/* if a semicolon-separated list of file extensions was given, do not include the /* if a semicolon-separated list of file extensions was given, do not include the
semicolon or anything after it in the extension. semicolon or anything after it in the extension.
example: if filterExt was "*.abc;*.def", it will become "*.abc" */ example: if filterExt was "*.abc;*.def", it will become "*.abc" */
filterAtSemicolon = strchrW(filterExt, ';'); filterSearchIndex = strchrW(filterExt, ';');
if (filterAtSemicolon) if (filterSearchIndex)
{ {
filterAtSemicolon[0] = '\0'; filterSearchIndex[0] = '\0';
} }
/* strip the * or anything else from the extension, "*.abc" becomes "abc" */ /* strip the * or anything else from the extension, "*.abc" becomes "abc" */
strcpyW(filterExt, PathFindExtensionW(filterExt) + 1); /* if the extension is invalid or contains a glob, ignore it */
filterSearchIndex = PathFindExtensionW(filterExt);
/* if the extension contains a glob, ignore it */ if (*filterSearchIndex++ && !strchrW(filterSearchIndex, '*') && !strchrW(filterSearchIndex, '?'))
if (strchrW(filterExt, '*') || strchrW(filterExt, '?')) {
strcpyW(filterExt, filterSearchIndex);
}
else
{ {
HeapFree(GetProcessHeap(), 0, filterExt); HeapFree(GetProcessHeap(), 0, filterExt);
filterExt = NULL; filterExt = NULL;
@ -2576,7 +2579,7 @@ BOOL FILEDLG95_OnOpen(HWND hwnd)
if (!filterExt) if (!filterExt)
{ {
/* use the default file extension */ /* use the default file extension */
filterExt = HeapAlloc(GetProcessHeap(), 0, lstrlenW(fodInfos->defext) * sizeof(WCHAR) + sizeof(WCHAR)); filterExt = HeapAlloc(GetProcessHeap(), 0, (lstrlenW(fodInfos->defext) + 1) * sizeof(WCHAR));
strcpyW(filterExt, fodInfos->defext); strcpyW(filterExt, fodInfos->defext);
} }
@ -2585,7 +2588,7 @@ BOOL FILEDLG95_OnOpen(HWND hwnd)
/* Attach the dot*/ /* Attach the dot*/
lstrcatW(lpstrPathAndFile, szwDot); lstrcatW(lpstrPathAndFile, szwDot);
/* Attach the extension */ /* Attach the extension */
lstrcatW(lpstrPathAndFile, filterExt ); lstrcatW(lpstrPathAndFile, filterExt);
} }
HeapFree(GetProcessHeap(), 0, filterExt); HeapFree(GetProcessHeap(), 0, filterExt);

View File

@ -1086,6 +1086,7 @@ static void test_extension(void)
"TestFilter (*.pt*;*.abc)\0*.pt*;*.abc\0", "TestFilter (*.pt*;*.abc)\0*.pt*;*.abc\0",
"TestFilter (*.ab?)\0*.ab?\0", "TestFilter (*.ab?)\0*.ab?\0",
"TestFilter (*.*)\0*.*\0", "TestFilter (*.*)\0*.*\0",
"TestFilter (*sav)\0*sav\0",
NULL /* is a test, not an endmark! */ NULL /* is a test, not an endmark! */
}; };