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