diff --git a/src/cascadia/TerminalApp/AppActionHandlers.cpp b/src/cascadia/TerminalApp/AppActionHandlers.cpp index ae79289fa..a461d653a 100644 --- a/src/cascadia/TerminalApp/AppActionHandlers.cpp +++ b/src/cascadia/TerminalApp/AppActionHandlers.cpp @@ -173,6 +173,15 @@ namespace winrt::TerminalApp::implementation } else if (const auto& realArgs = args.ActionArgs().try_as()) { + if (const auto index = newTerminalArgs.ProfileIndex()) + { + if (index >= _settings->ActiveProfiles().Size()) + { + args.Handled(false); + return; + } + } + _SplitPane(realArgs.SplitDirection(), realArgs.SplitMode(), // This is safe, we're already filtering so the value is (0, 1) @@ -290,6 +299,15 @@ namespace winrt::TerminalApp::implementation } else if (const auto& realArgs = args.ActionArgs().try_as()) { + if (const auto index = newTerminalArgs.ProfileIndex()) + { + if (index >= _settings->ActiveProfiles().Size()) + { + args.Handled(false); + return; + } + } + LOG_IF_FAILED(_OpenNewTab(realArgs.TerminalArgs())); args.Handled(true); } diff --git a/src/cascadia/TerminalApp/TabManagement.cpp b/src/cascadia/TerminalApp/TabManagement.cpp index a339b2bfe..ec219cd75 100644 --- a/src/cascadia/TerminalApp/TabManagement.cpp +++ b/src/cascadia/TerminalApp/TabManagement.cpp @@ -63,6 +63,12 @@ namespace winrt::TerminalApp::implementation try { const auto profile{ _settings.GetProfileForArgs(newTerminalArgs) }; + // GH#11114: GetProfileForArgs can return null if the index is higher + // than the number of available profiles. + if (!profile) + { + return S_FALSE; + } const auto settings{ TerminalSettings::CreateWithNewTerminalArgs(_settings, newTerminalArgs, *_bindings) }; _CreateNewTabWithProfileAndSettings(profile, settings, existingConnection); diff --git a/src/cascadia/TerminalApp/TerminalPage.cpp b/src/cascadia/TerminalApp/TerminalPage.cpp index 25140362d..820b8619d 100644 --- a/src/cascadia/TerminalApp/TerminalPage.cpp +++ b/src/cascadia/TerminalApp/TerminalPage.cpp @@ -1560,6 +1560,12 @@ namespace winrt::TerminalApp::implementation if (!profile) { profile = _settings.GetProfileForArgs(newTerminalArgs); + // GH#11114: GetProfileForArgs can return null if the index is + // higher than the number of available profiles. + if (!profile) + { + return; + } controlSettings = TerminalSettings::CreateWithNewTerminalArgs(_settings, newTerminalArgs, *_bindings); } diff --git a/src/cascadia/TerminalSettingsModel/CascadiaSettings.cpp b/src/cascadia/TerminalSettingsModel/CascadiaSettings.cpp index d49ff4968..19f8472b8 100644 --- a/src/cascadia/TerminalSettingsModel/CascadiaSettings.cpp +++ b/src/cascadia/TerminalSettingsModel/CascadiaSettings.cpp @@ -537,6 +537,13 @@ Model::Profile CascadiaSettings::GetProfileForArgs(const Model::NewTerminalArgs& { return profile; } + else + { + // GH#11114 - Return NOTHING if they asked for a profile index + // outside the range of available profiles. + // Really, the caller should check this beforehand + return nullptr; + } } }