diff --git a/src/cascadia/TerminalSettingsEditor/Launch.xaml b/src/cascadia/TerminalSettingsEditor/Launch.xaml index e68076a503..2498662a4c 100644 --- a/src/cascadia/TerminalSettingsEditor/Launch.xaml +++ b/src/cascadia/TerminalSettingsEditor/Launch.xaml @@ -184,6 +184,8 @@ Grid.Row="0" Grid.Column="1" VerticalAlignment="Center" + Maximum="999" + Minimum="1" Style="{StaticResource LaunchSizeNumberBoxStyle}" Value="{x:Bind ViewModel.InitialCols, Mode=TwoWay}" /> diff --git a/src/cascadia/TerminalSettingsModel/GlobalAppSettings.cpp b/src/cascadia/TerminalSettingsModel/GlobalAppSettings.cpp index c307050a99..ff6dd5eec6 100644 --- a/src/cascadia/TerminalSettingsModel/GlobalAppSettings.cpp +++ b/src/cascadia/TerminalSettingsModel/GlobalAppSettings.cpp @@ -137,6 +137,17 @@ void GlobalAppSettings::LayerJson(const Json::Value& json, const OriginTag origi MTSM_GLOBAL_SETTINGS(GLOBAL_SETTINGS_LAYER_JSON) #undef GLOBAL_SETTINGS_LAYER_JSON + // GH#11975 We only want to allow sensible values and prevent crashes, so we are clamping those values + // We only want to assign if the value did change through clamping, + // otherwise we could end up setting defaults that get persisted + if (this->HasInitialCols()) + { + this->InitialCols(std::clamp(this->InitialCols(), 1, 999)); + } + if (this->HasInitialRows()) + { + this->InitialRows(std::clamp(this->InitialRows(), 1, 999)); + } LayerActionsFrom(json, origin, true); JsonUtils::GetValueForKey(json, LegacyReloadEnvironmentVariablesKey, _legacyReloadEnvironmentVariables); diff --git a/src/cascadia/UnitTests_SettingsModel/DeserializationTests.cpp b/src/cascadia/UnitTests_SettingsModel/DeserializationTests.cpp index 2425e3421d..bd17076bc9 100644 --- a/src/cascadia/UnitTests_SettingsModel/DeserializationTests.cpp +++ b/src/cascadia/UnitTests_SettingsModel/DeserializationTests.cpp @@ -47,6 +47,7 @@ namespace SettingsModelUnitTests TEST_METHOD(ValidateKeybindingsWarnings); TEST_METHOD(ValidateColorSchemeInCommands); TEST_METHOD(ValidateExecuteCommandlineWarning); + TEST_METHOD(TestClampingOfStartupColumnAndViewProperties); TEST_METHOD(TestTrailingCommas); TEST_METHOD(TestCommandsAndKeybindings); TEST_METHOD(TestNestedCommandWithoutName); @@ -1301,6 +1302,20 @@ namespace SettingsModelUnitTests VERIFY_ARE_EQUAL(SettingsLoadWarnings::MissingRequiredParameter, settings->Warnings().GetAt(3)); } + void DeserializationTests::TestClampingOfStartupColumnAndViewProperties() + { + static constexpr std::string_view inputSettings{ R"({ + "initialCols" : 1000000, + "initialRows" : -1000000, + "profiles": [{ "name": "profile0" }] + })" }; + + const auto settings = createSettings(inputSettings); + + VERIFY_ARE_EQUAL(999, settings->GlobalSettings().InitialCols()); + VERIFY_ARE_EQUAL(1, settings->GlobalSettings().InitialRows()); + } + void DeserializationTests::TestTrailingCommas() { static constexpr std::string_view badSettings{ R"({