From 7d3b662d5b3e3c3f6cf9ed3f17f3ab4dda4923f3 Mon Sep 17 00:00:00 2001 From: Nimrod Gileadi Date: Wed, 3 Apr 2024 08:56:08 -0700 Subject: [PATCH] Check for invalid node tags in gmsh parser. PiperOrigin-RevId: 621538409 Change-Id: I91ba56b931d815fccd65ae32281bc19ae3a45ee7 --- src/user/user_flexcomp.cc | 15 +++++++++++++++ test/user/user_flex_test.cc | 17 ++++++++--------- 2 files changed, 23 insertions(+), 9 deletions(-) diff --git a/src/user/user_flexcomp.cc b/src/user/user_flexcomp.cc index 730f8ab1..b5944021 100644 --- a/src/user/user_flexcomp.cc +++ b/src/user/user_flexcomp.cc @@ -1366,6 +1366,9 @@ void mjCFlexcomp::LoadGMSH22(char* buffer, int binary, int nodeend, if (!ss.good()) { throw mjCError(NULL, "Error reading Elements"); } + if (nodeTag > numElements || nodeTag < 1) { + throw mjCError(NULL, "Invalid node tag"); + } element.push_back((int)(nodeTag-1)); } } @@ -1432,6 +1435,9 @@ void mjCFlexcomp::LoadGMSH22(char* buffer, int binary, int nodeend, // read first element for (int k =0; k numElements || nodeTag < 1) { + throw mjCError(NULL, "Invalid node tag"); + } element.push_back(nodeTag-1); } @@ -1445,6 +1451,9 @@ void mjCFlexcomp::LoadGMSH22(char* buffer, int binary, int nodeend, for (int k =0; k < numNodeTags; k++) { const char* nodeTagBuffer = elementsBuffer + componentSize*(6+k); ReadFromBuffer(&nodeTag, nodeTagBuffer + offset); + if (nodeTag > numElements || nodeTag < 1) { + throw mjCError(NULL, "Invalid node tag"); + } element.push_back(nodeTag-1); } } @@ -1456,6 +1465,9 @@ void mjCFlexcomp::LoadGMSH22(char* buffer, int binary, int nodeend, for (int k =0; k < numNodeTags; k++) { const char* nodeTagBuffer = elementsBuffer + componentSize*(4+k); ReadFromBuffer(&nodeTag, nodeTagBuffer); + if (nodeTag > numElements || nodeTag < 1) { + throw mjCError(NULL, "Invalid node tag"); + } element.push_back(nodeTag-1); } @@ -1467,6 +1479,9 @@ void mjCFlexcomp::LoadGMSH22(char* buffer, int binary, int nodeend, for (int k=0; k < numNodeTags; k++) { const char* nodeTagBuffer = elementsBuffer + componentSize*(3+k); ReadFromBuffer(&nodeTag, nodeTagBuffer + offset); + if (nodeTag > numElements || nodeTag < 1) { + throw mjCError(NULL, "Invalid node tag"); + } element.push_back(nodeTag-1); } } diff --git a/test/user/user_flex_test.cc b/test/user/user_flex_test.cc index aaaa7364..01b6534c 100644 --- a/test/user/user_flex_test.cc +++ b/test/user/user_flex_test.cc @@ -220,8 +220,8 @@ TEST_F(UserFlexTest, CreateBVHSuccess) { GetTestDataFilePath("user/testdata/robot_arm.xml"); std::array error; mjModel* m = mj_loadXML(xml_path.c_str(), 0, error.data(), error.size()); + ASSERT_THAT(m, NotNull()) << error.data(); mjData* d = mj_makeData(m); - EXPECT_THAT(m, NotNull()) << error.data(); mj_step(m, d); mj_deleteModel(m); mj_deleteData(d); @@ -232,8 +232,8 @@ TEST_F(UserFlexTest, LoadMSHBinaryGMSH_41_Success) { GetTestDataFilePath("user/testdata/shark_41_binary_gmshApp.xml"); std::array error; mjModel* m = mj_loadXML(xml_path.c_str(), 0, error.data(), error.size()); + ASSERT_THAT(m, NotNull()) << error.data(); mjData* d = mj_makeData(m); - EXPECT_THAT(m, NotNull()) << error.data(); EXPECT_EQ(m->nflexvert, 652); EXPECT_EQ(m->nflexelem, 1654); mj_step(m, d); @@ -246,8 +246,8 @@ TEST_F(UserFlexTest, LoadMSHBinaryGMSH_22_Success) { GetTestDataFilePath("user/testdata/shark_22_binary_gmshApp.xml"); std::array error; mjModel* m = mj_loadXML(xml_path.c_str(), 0, error.data(), error.size()); + ASSERT_THAT(m, NotNull()) << error.data(); mjData* d = mj_makeData(m); - EXPECT_THAT(m, NotNull()) << error.data(); EXPECT_EQ(m->nflexvert, 644); EXPECT_EQ(m->nflexelem, 1635); mj_step(m, d); @@ -260,8 +260,8 @@ TEST_F(UserFlexTest, LoadMSHBinaryFTETWILD_22_Success) { GetTestDataFilePath("user/testdata/shark_22_binary_fTetWild.xml"); std::array error; mjModel* m = mj_loadXML(xml_path.c_str(), 0, error.data(), error.size()); + ASSERT_THAT(m, NotNull()) << error.data(); mjData* d = mj_makeData(m); - EXPECT_THAT(m, NotNull()) << error.data(); EXPECT_EQ(m->nflexvert, 644); EXPECT_EQ(m->nflexelem, 1635); mj_step(m, d); @@ -274,8 +274,8 @@ TEST_F(UserFlexTest, LoadMSHASCIIGMSH_41_Success) { GetTestDataFilePath("user/testdata/shark_41_ascii_gmshApp.xml"); std::array error; mjModel* m = mj_loadXML(xml_path.c_str(), 0, error.data(), error.size()); + ASSERT_THAT(m, NotNull()) << error.data(); mjData* d = mj_makeData(m); - EXPECT_THAT(m, NotNull()) << error.data(); EXPECT_EQ(m->nflexvert, 652); EXPECT_EQ(m->nflexelem, 1654); mj_step(m, d); @@ -288,8 +288,8 @@ TEST_F(UserFlexTest, LoadMSHASCIIGMSH_22_Success) { GetTestDataFilePath("user/testdata/shark_22_ascii_gmshApp.xml"); std::array error; mjModel* m = mj_loadXML(xml_path.c_str(), 0, error.data(), error.size()); + ASSERT_THAT(m, NotNull()) << error.data(); mjData* d = mj_makeData(m); - EXPECT_THAT(m, NotNull()) << error.data(); EXPECT_EQ(m->nflexvert, 652); EXPECT_EQ(m->nflexelem, 1654); mj_step(m, d); @@ -302,8 +302,8 @@ TEST_F(UserFlexTest, LoadMSHASCIIFTETWILD_22_Success) { GetTestDataFilePath("user/testdata/shark_22_ascii_fTetWild.xml"); std::array error; mjModel* m = mj_loadXML(xml_path.c_str(), 0, error.data(), error.size()); + ASSERT_THAT(m, NotNull()) << error.data(); mjData* d = mj_makeData(m); - EXPECT_THAT(m, NotNull()) << error.data(); EXPECT_EQ(m->nflexvert, 652); EXPECT_EQ(m->nflexelem, 1654); mj_step(m, d); @@ -383,8 +383,7 @@ TEST_F(UserFlexTest, LoadMSHASCII_22_MissingNumElements_Fail) { "user/testdata/malformed_shark_22_ascii_missing_num_elements.xml"); std::array error; mjModel* m = mj_loadXML(xml_path.c_str(), 0, error.data(), error.size()); - EXPECT_THAT(error.data(), HasSubstr( - "XML Error: Element size must be a multiple of dim+1")); + EXPECT_THAT(error.data(), HasSubstr("XML Error: Error: Invalid node tag")); mj_deleteModel(m); }