comdlg32: Correctly handle filters with invalid extensions in Save As dialogs.
This commit is contained in:
parent
02b12e1117
commit
f0b274bada
|
@ -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);
|
||||||
|
|
|
@ -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! */
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue