From 7f9f8b5429b1fd8b9713071f80a2b4562bfa0f80 Mon Sep 17 00:00:00 2001 From: Alessio Quaglino Date: Wed, 10 Jul 2024 09:03:13 -0700 Subject: [PATCH] Catch errors in attach during replicate. PiperOrigin-RevId: 651041336 Change-Id: I59986e157b4e22c74f8b8493899cdd4a3d5df839 --- src/user/user_api.cc | 12 +++++++-- src/xml/xml_native_reader.cc | 4 ++- test/xml/xml_native_reader_test.cc | 39 ++++++++++++++++++++++++++++++ 3 files changed, 52 insertions(+), 3 deletions(-) diff --git a/src/user/user_api.cc b/src/user/user_api.cc index 674e034a..4a3af440 100644 --- a/src/user/user_api.cc +++ b/src/user/user_api.cc @@ -98,7 +98,11 @@ int mjs_attachBody(mjsFrame* parent, const mjsBody* child, const char* prefix, const char* suffix) { mjCFrame* frame_parent = static_cast(parent->element); mjCBody* child_body = static_cast(child->element); - *frame_parent += std::string(prefix) + *child_body + std::string(suffix); + try { + *frame_parent += std::string(prefix) + *child_body + std::string(suffix); + } catch (mjCError& e) { + return -1; + } return 0; } @@ -109,7 +113,11 @@ int mjs_attachFrame(mjsBody* parent, const mjsFrame* child, const char* prefix, const char* suffix) { mjCBody* body_parent = static_cast(parent->element); mjCFrame* child_frame = static_cast(child->element); - *body_parent += std::string(prefix) + *child_frame + std::string(suffix); + try { + *body_parent += std::string(prefix) + *child_frame + std::string(suffix); + } catch (mjCError& e) { + return -1; + } return 0; } diff --git a/src/xml/xml_native_reader.cc b/src/xml/xml_native_reader.cc index a321da0e..953988ca 100644 --- a/src/xml/xml_native_reader.cc +++ b/src/xml/xml_native_reader.cc @@ -3437,7 +3437,9 @@ void mjXReader::Body(XMLElement* section, mjsBody* pbody, mjsFrame* frame) { Body(elem, subtree, pframe); // attach to parent - mjs_attachFrame(pbody, pframe, /*prefix=*/"", suffix.c_str()); + if (mjs_attachFrame(pbody, pframe, /*prefix=*/"", suffix.c_str()) < 0) { + throw mjXError(elem, "failed to attach frame"); + } } // delete subtree diff --git a/test/xml/xml_native_reader_test.cc b/test/xml/xml_native_reader_test.cc index 06a3268b..f6ae02f7 100644 --- a/test/xml/xml_native_reader_test.cc +++ b/test/xml/xml_native_reader_test.cc @@ -1217,6 +1217,45 @@ TEST_F(XMLReaderTest, ParseReplicateDefaultPropagate) { mj_deleteSpec(spec); } +TEST_F(XMLReaderTest, ParseReplicateRepeatedName) { + static constexpr char xml[] = R"( + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + )"; + std::array error; + mjSpec* spec = mj_parseXMLString(xml, 0, error.data(), error.size()); + EXPECT_THAT(spec, IsNull()) << error.data(); + EXPECT_THAT(error.data(), HasSubstr("failed to attach frame")); +} + // ----------------------- test camera parsing --------------------------------- TEST_F(XMLReaderTest, CameraInvalidFovyAndSensorsize) {