From fa5d3496ef0b408d2bc6c4c8850f8907a3828e01 Mon Sep 17 00:00:00 2001 From: wpumacay Date: Wed, 24 Sep 2025 21:05:14 -0700 Subject: [PATCH] Adds a fix for parsing gridlayout - Resets the gridlayout string to zeros with memset to avoid taking the extra characters that are not copied when using memcpy with a shorter string - Adds a test for this when using mjSpec --- src/xml/xml_native_reader.cc | 1 + test/xml/xml_native_reader_test.cc | 20 ++++++++++++++++++++ 2 files changed, 21 insertions(+) diff --git a/src/xml/xml_native_reader.cc b/src/xml/xml_native_reader.cc index 4a6041733b..75093eeb73 100644 --- a/src/xml/xml_native_reader.cc +++ b/src/xml/xml_native_reader.cc @@ -3264,6 +3264,7 @@ void mjXReader::Asset(XMLElement* section, const mjVFS* vfs) { throw mjXError(elem, "gridlayout length must match gridsize"); } + memset(texture->gridlayout, 0, sizeof(texture->gridlayout)); memcpy(texture->gridlayout, text.data(), text.length()); } diff --git a/test/xml/xml_native_reader_test.cc b/test/xml/xml_native_reader_test.cc index b6c0779ad7..fdfea80953 100644 --- a/test/xml/xml_native_reader_test.cc +++ b/test/xml/xml_native_reader_test.cc @@ -1967,6 +1967,26 @@ TEST_F(XMLReaderTest, ResizeKeyframeAfterParsing) { mj_deleteVFS(vfs.get()); } +TEST_F(XMLReaderTest, CheckTextureGridlayoutParsing) { + static constexpr char xml[] = R"( + + + + + + )"; + + std::array error; + mjSpec* spec = mj_parseXMLString(xml, 0, error.data(), error.size()); + EXPECT_THAT(spec, NotNull()) << error.data(); + auto skybox_spec = mjs_asTexture(mjs_findElement(spec, mjOBJ_TEXTURE, "test_skybox")); + EXPECT_THAT(skybox_spec, NotNull()) << error.data(); + EXPECT_EQ(std::strlen(skybox_spec->gridlayout), 8); + EXPECT_TRUE(std::strcmp(skybox_spec->gridlayout, "LFRB.D..") == 0); + + mj_deleteSpec(spec); +} + // ----------------------- test camera parsing --------------------------------- TEST_F(XMLReaderTest, CameraInvalidFovyAndSensorsize) {