From 1041b6f2a6918c90fe0fce20b9caf350d604d4e0 Mon Sep 17 00:00:00 2001 From: codereader Date: Sun, 28 Feb 2021 05:17:07 +0100 Subject: [PATCH] #5532: Max number of vertexParms is 4. --- libs/materials/ParseLib.h | 2 ++ radiantcore/shaders/ShaderTemplate.cpp | 5 +++++ test/Materials.cpp | 3 +++ test/resources/tdm/materials/parsertest.mtr | 13 ++++++++++++- 4 files changed, 22 insertions(+), 1 deletion(-) diff --git a/libs/materials/ParseLib.h b/libs/materials/ParseLib.h index d65337e9be..f5018b287d 100644 --- a/libs/materials/ParseLib.h +++ b/libs/materials/ParseLib.h @@ -123,4 +123,6 @@ inline std::string getStringForTexGenType(ShaderLayer::TexGenType type) return std::string(); } +constexpr int NUM_MAX_VERTEX_PARMS = 4; + } diff --git a/radiantcore/shaders/ShaderTemplate.cpp b/radiantcore/shaders/ShaderTemplate.cpp index 9b25ab31c9..b5c7edb43c 100644 --- a/radiantcore/shaders/ShaderTemplate.cpp +++ b/radiantcore/shaders/ShaderTemplate.cpp @@ -786,6 +786,11 @@ bool ShaderTemplate::parseStageModifiers(parser::DefTokeniser& tokeniser, // vertexParm [,] [,] [,] parm.index = string::convert(tokeniser.nextToken()); + if (parm.index < 0 || parm.index >= NUM_MAX_VERTEX_PARMS) + { + throw parser::ParseException(fmt::format("A material stage can have {0} vertex parameters at most", NUM_MAX_VERTEX_PARMS)); + } + parm.expressions[0] = ShaderExpression::createFromTokens(tokeniser); for (int i = 1; i < 4 && tokeniser.peek() == ","; ++i) diff --git a/test/Materials.cpp b/test/Materials.cpp index eccb909077..177fd24516 100644 --- a/test/Materials.cpp +++ b/test/Materials.cpp @@ -398,6 +398,9 @@ TEST_F(MaterialsTest, MaterialParserStageVertexProgram) EXPECT_EQ(material->getAllLayers().front()->getVertexParm(2).expressions[1]->getExpressionString(), "6.0"); EXPECT_EQ(material->getAllLayers().front()->getVertexParm(2).expressions[2]->getExpressionString(), "7.0"); EXPECT_EQ(material->getAllLayers().front()->getVertexParm(2).expressions[3]->getExpressionString(), "8.0"); + + material = GlobalMaterialManager().getMaterialForName("textures/parsertest/program/vertexProgram7"); + EXPECT_TRUE(material->getAllLayers().empty()); // failure to parse should end up with an empty material } } diff --git a/test/resources/tdm/materials/parsertest.mtr b/test/resources/tdm/materials/parsertest.mtr index 821cb163d4..1cdecb46a3 100644 --- a/test/resources/tdm/materials/parsertest.mtr +++ b/test/resources/tdm/materials/parsertest.mtr @@ -244,4 +244,15 @@ textures/parsertest/program/vertexProgram6 // index 1 is missing vertexParm 2 5,6,7,8 } -} \ No newline at end of file +} + +textures/parsertest/program/vertexProgram7 +{ + { + map _white + vertexProgram glprogs/test.vfp + + // Maximum number of vertexParms is 4, index 5 is invalid + vertexParm 5 5,6,7,8 + } +}