diff --git a/radiantcore/layers/LayerManager.cpp b/radiantcore/layers/LayerManager.cpp index 00fa5d85ba..134cba4266 100644 --- a/radiantcore/layers/LayerManager.cpp +++ b/radiantcore/layers/LayerManager.cpp @@ -253,6 +253,8 @@ bool LayerManager::setLayerVisibilityRecursively(int rootLayerId, bool visible) foreachLayerInHierarchy(rootLayerId, [&](int layerId) { + if (layerId < 0 || layerId >= _layerVisibility.size()) return; + visibilityChange |= _layerVisibility.at(layerId) != visible; _layerVisibility.at(layerId) = visible; }); diff --git a/test/LayerManipulation.cpp b/test/LayerManipulation.cpp index bbbb508c83..6fcb23dbee 100644 --- a/test/LayerManipulation.cpp +++ b/test/LayerManipulation.cpp @@ -402,6 +402,15 @@ TEST_F(LayerTest, SetLayerVisibilityAffectsActiveLayer) EXPECT_EQ(layerManager.getActiveLayer(), testLayerId) << "The test layer should now be active"; } +TEST_F(LayerTest, SetLayerVisibilityUsingInvalidId) +{ + auto& layerManager = GlobalMapModule().getRoot()->getLayerManager(); + + // Hide non-existent layers + EXPECT_NO_THROW(layerManager.setLayerVisibility(333, false)); + EXPECT_NO_THROW(layerManager.setLayerVisibility(-2, false)); +} + TEST_F(LayerTest, SetLayerVisibilityAffectsNode) { loadMap("general_purpose.mapx");