diff --git a/src/cascadia/TerminalControl/ControlCore.cpp b/src/cascadia/TerminalControl/ControlCore.cpp index 7def807daf..9ca869bc7e 100644 --- a/src/cascadia/TerminalControl/ControlCore.cpp +++ b/src/cascadia/TerminalControl/ControlCore.cpp @@ -1745,7 +1745,11 @@ namespace winrt::Microsoft::Terminal::Control::implementation void ControlCore::OpenCWD() { const auto workingDirectory = WorkingDirectory(); - ShellExecute(nullptr, nullptr, L"explorer", workingDirectory.c_str(), nullptr, SW_SHOW); + if (!Utils::IsValidDirectory(workingDirectory.c_str())) + { + return; + } + ShellExecute(nullptr, nullptr, workingDirectory.c_str(), nullptr, nullptr, SW_SHOW); } void ControlCore::ClearQuickFix() diff --git a/src/types/ut_types/UtilsTests.cpp b/src/types/ut_types/UtilsTests.cpp index fb83f0e875..01b4aab82c 100644 --- a/src/types/ut_types/UtilsTests.cpp +++ b/src/types/ut_types/UtilsTests.cpp @@ -34,6 +34,7 @@ class UtilsTests TEST_METHOD(TestDontTrimTrailingWhitespace); TEST_METHOD(TestEvaluateStartingDirectory); + TEST_METHOD(TestIsValidDirectory); void _VerifyXTermColorResult(const std::wstring_view wstr, DWORD colorValue); void _VerifyXTermColorInvalid(const std::wstring_view wstr); @@ -618,3 +619,23 @@ void UtilsTests::TestEvaluateStartingDirectory() test(L"/dev", cwd, L"/dev"); } } + +void UtilsTests::TestIsValidDirectory() +{ + VERIFY_IS_FALSE(IsValidDirectory(nullptr)); + VERIFY_IS_FALSE(IsValidDirectory(L"")); + + // OSC 7 / 9;9 can store these. They are not directories. + VERIFY_IS_FALSE(IsValidDirectory(L"https://example.com")); + VERIFY_IS_FALSE(IsValidDirectory(L"/select,C:\\Windows")); + VERIFY_IS_FALSE(IsValidDirectory(L"shell:AppsFolder\\Foo")); + + wchar_t tempPath[MAX_PATH]{}; + VERIFY_IS_GREATER_THAN(GetTempPathW(ARRAYSIZE(tempPath), tempPath), 0u); + VERIFY_IS_TRUE(IsValidDirectory(tempPath)); + + wchar_t tempFile[MAX_PATH]{}; + VERIFY_ARE_NOT_EQUAL(0u, GetTempFileNameW(tempPath, L"ut", 0, tempFile)); + VERIFY_IS_FALSE(IsValidDirectory(tempFile)); + DeleteFileW(tempFile); +}