From ea4d71b26c7962ac433dea5d9b51a60cc3797f39 Mon Sep 17 00:00:00 2001 From: paxcut <53811119+paxcut@users.noreply.github.com> Date: Tue, 17 Jun 2025 12:32:09 -0700 Subject: [PATCH] fix: fixes for various errors related to shared_from_this. (#2297) A while back there were some changes to the pattern language library that changed the way shared_pointers are created using shared_from_this(). Unfortunatelly the changes were not complete and various bugs were created among them 2234, json type not working, unable to export files, static arrays of bitfields,... The cause of the errors was that in class Pattern the member m_parent was left as a raw pointer and it needs to be handled by shared pointers. Also there were some cases in which share pointers were needed but unique pointers were used instead. Both cause crashes when shared_from_this is used on pointers that are not managed by shared_ptr. Another source of errors were infinite loops of clone and reference that caused stack overflow. The fixes include making m_parent a weak pointer, turning unique pointers into shared pointers and moving codefrom the copy constructors into clone to break the infinite loops.These changes are the bare minimum needed to bring the pattern language back to the full functionality that it had before shared_from_this was introduced or at least thats the hope. --- lib/external/pattern_language | 2 +- .../source/content/pl_builtin_types.cpp | 20 +++++++++---------- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/lib/external/pattern_language b/lib/external/pattern_language index 7a741cef1..cbea338a0 160000 --- a/lib/external/pattern_language +++ b/lib/external/pattern_language @@ -1 +1 @@ -Subproject commit 7a741cef116e5bf4fe9a895a724894c2dc071348 +Subproject commit cbea338a0558d004d9bde4b357b47921ec6f7216 diff --git a/plugins/builtin/source/content/pl_builtin_types.cpp b/plugins/builtin/source/content/pl_builtin_types.cpp index fd2166fe4..140137660 100644 --- a/plugins/builtin/source/content/pl_builtin_types.cpp +++ b/plugins/builtin/source/content/pl_builtin_types.cpp @@ -197,8 +197,8 @@ namespace hex::plugin::builtin { } - std::unique_ptr jsonToPattern(pl::core::Evaluator *evaluator, auto function) { - auto object = std::make_unique(evaluator, 0, 0, 0); + std::shared_ptr jsonToPattern(pl::core::Evaluator *evaluator, auto function) { + auto object = std::make_shared(evaluator, 0, 0, 0); std::vector> patterns; try { @@ -221,7 +221,7 @@ namespace hex::plugin::builtin { const pl::api::Namespace nsHexDec = { "builtin", "hex", "dec" }; /* Json */ - ContentRegistry::PatternLanguage::addType(nsHexDec, "Json", FunctionParameterCount::exactly(1), [](Evaluator *evaluator, auto params) -> std::unique_ptr { + ContentRegistry::PatternLanguage::addType(nsHexDec, "Json", FunctionParameterCount::exactly(1), [](Evaluator *evaluator, auto params) -> std::shared_ptr { auto data = params[0].toBytes(); auto result = jsonToPattern(evaluator, [&] { return nlohmann::json::parse(data); }); @@ -230,7 +230,7 @@ namespace hex::plugin::builtin { }); /* Bson */ - ContentRegistry::PatternLanguage::addType(nsHexDec, "Bson", FunctionParameterCount::exactly(1), [](Evaluator *evaluator, auto params) -> std::unique_ptr { + ContentRegistry::PatternLanguage::addType(nsHexDec, "Bson", FunctionParameterCount::exactly(1), [](Evaluator *evaluator, auto params) -> std::shared_ptr { auto data = params[0].toBytes(); auto result = jsonToPattern(evaluator, [&] { return nlohmann::json::from_bson(data); }); @@ -239,7 +239,7 @@ namespace hex::plugin::builtin { }); /* Cbor */ - ContentRegistry::PatternLanguage::addType(nsHexDec, "Cbor", FunctionParameterCount::exactly(1), [](Evaluator *evaluator, auto params) -> std::unique_ptr { + ContentRegistry::PatternLanguage::addType(nsHexDec, "Cbor", FunctionParameterCount::exactly(1), [](Evaluator *evaluator, auto params) -> std::shared_ptr { auto data = params[0].toBytes(); auto result = jsonToPattern(evaluator, [&] { return nlohmann::json::from_cbor(data); }); @@ -248,7 +248,7 @@ namespace hex::plugin::builtin { }); /* Bjdata */ - ContentRegistry::PatternLanguage::addType(nsHexDec, "Bjdata", FunctionParameterCount::exactly(1), [](Evaluator *evaluator, auto params) -> std::unique_ptr { + ContentRegistry::PatternLanguage::addType(nsHexDec, "Bjdata", FunctionParameterCount::exactly(1), [](Evaluator *evaluator, auto params) -> std::shared_ptr { auto data = params[0].toBytes(); auto result = jsonToPattern(evaluator, [&] { return nlohmann::json::from_bjdata(data); }); @@ -257,7 +257,7 @@ namespace hex::plugin::builtin { }); /* Msgpack */ - ContentRegistry::PatternLanguage::addType(nsHexDec, "Msgpack", FunctionParameterCount::exactly(1), [](Evaluator *evaluator, auto params) -> std::unique_ptr { + ContentRegistry::PatternLanguage::addType(nsHexDec, "Msgpack", FunctionParameterCount::exactly(1), [](Evaluator *evaluator, auto params) -> std::shared_ptr { auto data = params[0].toBytes(); auto result = jsonToPattern(evaluator, [&] { return nlohmann::json::from_msgpack(data); }); @@ -266,7 +266,7 @@ namespace hex::plugin::builtin { }); /* Ubjson */ - ContentRegistry::PatternLanguage::addType(nsHexDec, "Ubjson", FunctionParameterCount::exactly(1), [](Evaluator *evaluator, auto params) -> std::unique_ptr { + ContentRegistry::PatternLanguage::addType(nsHexDec, "Ubjson", FunctionParameterCount::exactly(1), [](Evaluator *evaluator, auto params) -> std::shared_ptr { auto data = params[0].toBytes(); auto result = jsonToPattern(evaluator, [&] { return nlohmann::json::from_ubjson(data); }); @@ -276,14 +276,14 @@ namespace hex::plugin::builtin { /* EncodedString */ - ContentRegistry::PatternLanguage::addType(nsHexDec, "EncodedString", FunctionParameterCount::exactly(2), [](Evaluator *evaluator, auto params) -> std::unique_ptr { + ContentRegistry::PatternLanguage::addType(nsHexDec, "EncodedString", FunctionParameterCount::exactly(2), [](Evaluator *evaluator, auto params) -> std::shared_ptr { auto bytes = params[0].toBytes(); auto encodingDefinition = params[1].toString(); std::string value; EncodingFile encodingFile(EncodingFile::Type::Thingy, encodingDefinition); - auto pattern = std::make_unique(evaluator, evaluator->getReadOffset(), bytes.size(), 0); + auto pattern = std::make_shared(evaluator, evaluator->getReadOffset(), bytes.size(), 0); pattern->setEncodedString(encodingFile, bytes); return pattern;