From ca521610a8115625ca8be15282ecb3d4acc72dd7 Mon Sep 17 00:00:00 2001 From: YX Hao Date: Wed, 24 Jan 2024 19:13:15 +0800 Subject: [PATCH] Fix argument parsing bug on "Run Command" dialog, PR #757. Current code fails when environment variable expanded result contains space (e.g. `%ProgramFiles%`). --- metapath/src/Dialogs.c | 7 ++++--- src/Dialogs.c | 7 ++++--- src/Edit.c | 4 ++-- 3 files changed, 10 insertions(+), 8 deletions(-) diff --git a/metapath/src/Dialogs.c b/metapath/src/Dialogs.c index 96067e14c9..9b7da41e5b 100644 --- a/metapath/src/Dialogs.c +++ b/metapath/src/Dialogs.c @@ -239,8 +239,9 @@ INT_PTR CALLBACK RunDlgProc(HWND hwnd, UINT umsg, WPARAM wParam, LPARAM lParam) WCHAR szFile[MAX_PATH * 2]; GetDlgItemText(hwnd, IDC_COMMANDLINE, szArgs, COUNTOF(szArgs)); - ExpandEnvironmentStringsEx(szArgs, COUNTOF(szArgs)); ExtractFirstArgument(szArgs, szFile, szArg2); + ExpandEnvironmentStringsEx(szFile, COUNTOF(szFile)); + ExpandEnvironmentStringsEx(szArg2, COUNTOF(szArg2)); WCHAR szTitle[32]; WCHAR szFilter[256]; @@ -302,13 +303,13 @@ INT_PTR CALLBACK RunDlgProc(HWND hwnd, UINT umsg, WPARAM wParam, LPARAM lParam) ExtractFirstArgument(arg1 + 1, arg1, arg2); DisplayPath(arg1, IDS_ERR_CMDLINE); } else { - ExpandEnvironmentStringsEx(arg1, COUNTOF(arg1)); ExtractFirstArgument(arg1, arg1, arg2); + ExpandEnvironmentStringsEx(arg2, COUNTOF(arg2)); SHELLEXECUTEINFO sei; memset(&sei, 0, sizeof(SHELLEXECUTEINFO)); sei.cbSize = sizeof(SHELLEXECUTEINFO); - sei.fMask = 0; + sei.fMask = SEE_MASK_DOENVSUBST; sei.hwnd = hwnd; sei.lpVerb = NULL; sei.lpFile = arg1; diff --git a/src/Dialogs.c b/src/Dialogs.c index c52d382c56..cb74d58359 100644 --- a/src/Dialogs.c +++ b/src/Dialogs.c @@ -445,8 +445,9 @@ static INT_PTR CALLBACK RunDlgProc(HWND hwnd, UINT umsg, WPARAM wParam, LPARAM l WCHAR szFile[MAX_PATH * 2]; GetDlgItemText(hwnd, IDC_COMMANDLINE, szArgs, COUNTOF(szArgs)); - ExpandEnvironmentStringsEx(szArgs, COUNTOF(szArgs)); ExtractFirstArgument(szArgs, szFile, szArg2); + ExpandEnvironmentStringsEx(szFile, COUNTOF(szFile)); + ExpandEnvironmentStringsEx(szArg2, COUNTOF(szArg2)); WCHAR szFilter[256]; GetString(IDS_FILTER_EXE, szFilter, COUNTOF(szFilter)); @@ -501,8 +502,8 @@ static INT_PTR CALLBACK RunDlgProc(HWND hwnd, UINT umsg, WPARAM wParam, LPARAM l bool bQuickExit = false; WCHAR arg2[MAX_PATH]; - ExpandEnvironmentStringsEx(arg1, COUNTOF(arg1)); ExtractFirstArgument(arg1, arg1, arg2); + ExpandEnvironmentStringsEx(arg2, COUNTOF(arg2)); if (StrCaseEqual(arg1, L"notepad2") || StrCaseEqual(arg1, L"notepad2.exe")) { GetModuleFileName(NULL, arg1, COUNTOF(arg1)); @@ -518,7 +519,7 @@ static INT_PTR CALLBACK RunDlgProc(HWND hwnd, UINT umsg, WPARAM wParam, LPARAM l SHELLEXECUTEINFO sei; memset(&sei, 0, sizeof(SHELLEXECUTEINFO)); sei.cbSize = sizeof(SHELLEXECUTEINFO); - sei.fMask = 0; + sei.fMask = SEE_MASK_DOENVSUBST; sei.hwnd = hwnd; sei.lpVerb = NULL; sei.lpFile = arg1; diff --git a/src/Edit.c b/src/Edit.c index b816a81285..ba0cb979b9 100644 --- a/src/Edit.c +++ b/src/Edit.c @@ -6930,10 +6930,10 @@ void EditSelectionAction(int action) { LPWSTR lpszCommand = (LPWSTR)NP2HeapAlloc(sizeof(WCHAR) * (cchEscapedW + COUNTOF(szCmdTemplate) + MAX_PATH + 32)); const size_t cbCommand = NP2HeapSize(lpszCommand); wsprintf(lpszCommand, szCmdTemplate, pszEscapedW); - ExpandEnvironmentStringsEx(lpszCommand, (DWORD)(cbCommand / sizeof(WCHAR))); LPWSTR lpszArgs = (LPWSTR)NP2HeapAlloc(cbCommand); ExtractFirstArgument(lpszCommand, lpszCommand, lpszArgs); + ExpandEnvironmentStringsEx(lpszArgs, (DWORD)(cbCommand / sizeof(WCHAR))); WCHAR wchDirectory[MAX_PATH] = L""; if (StrNotEmpty(szCurFile)) { @@ -6944,7 +6944,7 @@ void EditSelectionAction(int action) { SHELLEXECUTEINFO sei; memset(&sei, 0, sizeof(SHELLEXECUTEINFO)); sei.cbSize = sizeof(SHELLEXECUTEINFO); - sei.fMask = SEE_MASK_NOZONECHECKS; + sei.fMask = SEE_MASK_DOENVSUBST | SEE_MASK_NOZONECHECKS; sei.hwnd = NULL; sei.lpVerb = NULL; sei.lpFile = lpszCommand;