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) {