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.
This commit is contained in:
paxcut
2025-06-17 12:32:09 -07:00
committed by GitHub
parent a4c0d38c53
commit ea4d71b26c
2 changed files with 11 additions and 11 deletions

View File

@@ -197,8 +197,8 @@ namespace hex::plugin::builtin {
}
std::unique_ptr<pl::ptrn::Pattern> jsonToPattern(pl::core::Evaluator *evaluator, auto function) {
auto object = std::make_unique<pl::ptrn::PatternStruct>(evaluator, 0, 0, 0);
std::shared_ptr<pl::ptrn::Pattern> jsonToPattern(pl::core::Evaluator *evaluator, auto function) {
auto object = std::make_shared<pl::ptrn::PatternStruct>(evaluator, 0, 0, 0);
std::vector<std::shared_ptr<pl::ptrn::Pattern>> patterns;
try {
@@ -221,7 +221,7 @@ namespace hex::plugin::builtin {
const pl::api::Namespace nsHexDec = { "builtin", "hex", "dec" };
/* Json<data_pattern> */
ContentRegistry::PatternLanguage::addType(nsHexDec, "Json", FunctionParameterCount::exactly(1), [](Evaluator *evaluator, auto params) -> std::unique_ptr<pl::ptrn::Pattern> {
ContentRegistry::PatternLanguage::addType(nsHexDec, "Json", FunctionParameterCount::exactly(1), [](Evaluator *evaluator, auto params) -> std::shared_ptr<pl::ptrn::Pattern> {
auto data = params[0].toBytes();
auto result = jsonToPattern(evaluator, [&] { return nlohmann::json::parse(data); });
@@ -230,7 +230,7 @@ namespace hex::plugin::builtin {
});
/* Bson<data_pattern> */
ContentRegistry::PatternLanguage::addType(nsHexDec, "Bson", FunctionParameterCount::exactly(1), [](Evaluator *evaluator, auto params) -> std::unique_ptr<pl::ptrn::Pattern> {
ContentRegistry::PatternLanguage::addType(nsHexDec, "Bson", FunctionParameterCount::exactly(1), [](Evaluator *evaluator, auto params) -> std::shared_ptr<pl::ptrn::Pattern> {
auto data = params[0].toBytes();
auto result = jsonToPattern(evaluator, [&] { return nlohmann::json::from_bson(data); });
@@ -239,7 +239,7 @@ namespace hex::plugin::builtin {
});
/* Cbor<data_pattern> */
ContentRegistry::PatternLanguage::addType(nsHexDec, "Cbor", FunctionParameterCount::exactly(1), [](Evaluator *evaluator, auto params) -> std::unique_ptr<pl::ptrn::Pattern> {
ContentRegistry::PatternLanguage::addType(nsHexDec, "Cbor", FunctionParameterCount::exactly(1), [](Evaluator *evaluator, auto params) -> std::shared_ptr<pl::ptrn::Pattern> {
auto data = params[0].toBytes();
auto result = jsonToPattern(evaluator, [&] { return nlohmann::json::from_cbor(data); });
@@ -248,7 +248,7 @@ namespace hex::plugin::builtin {
});
/* Bjdata<data_pattern> */
ContentRegistry::PatternLanguage::addType(nsHexDec, "Bjdata", FunctionParameterCount::exactly(1), [](Evaluator *evaluator, auto params) -> std::unique_ptr<pl::ptrn::Pattern> {
ContentRegistry::PatternLanguage::addType(nsHexDec, "Bjdata", FunctionParameterCount::exactly(1), [](Evaluator *evaluator, auto params) -> std::shared_ptr<pl::ptrn::Pattern> {
auto data = params[0].toBytes();
auto result = jsonToPattern(evaluator, [&] { return nlohmann::json::from_bjdata(data); });
@@ -257,7 +257,7 @@ namespace hex::plugin::builtin {
});
/* Msgpack<data_pattern> */
ContentRegistry::PatternLanguage::addType(nsHexDec, "Msgpack", FunctionParameterCount::exactly(1), [](Evaluator *evaluator, auto params) -> std::unique_ptr<pl::ptrn::Pattern> {
ContentRegistry::PatternLanguage::addType(nsHexDec, "Msgpack", FunctionParameterCount::exactly(1), [](Evaluator *evaluator, auto params) -> std::shared_ptr<pl::ptrn::Pattern> {
auto data = params[0].toBytes();
auto result = jsonToPattern(evaluator, [&] { return nlohmann::json::from_msgpack(data); });
@@ -266,7 +266,7 @@ namespace hex::plugin::builtin {
});
/* Ubjson<data_pattern> */
ContentRegistry::PatternLanguage::addType(nsHexDec, "Ubjson", FunctionParameterCount::exactly(1), [](Evaluator *evaluator, auto params) -> std::unique_ptr<pl::ptrn::Pattern> {
ContentRegistry::PatternLanguage::addType(nsHexDec, "Ubjson", FunctionParameterCount::exactly(1), [](Evaluator *evaluator, auto params) -> std::shared_ptr<pl::ptrn::Pattern> {
auto data = params[0].toBytes();
auto result = jsonToPattern(evaluator, [&] { return nlohmann::json::from_ubjson(data); });
@@ -276,14 +276,14 @@ namespace hex::plugin::builtin {
/* EncodedString<data_pattern> */
ContentRegistry::PatternLanguage::addType(nsHexDec, "EncodedString", FunctionParameterCount::exactly(2), [](Evaluator *evaluator, auto params) -> std::unique_ptr<pl::ptrn::Pattern> {
ContentRegistry::PatternLanguage::addType(nsHexDec, "EncodedString", FunctionParameterCount::exactly(2), [](Evaluator *evaluator, auto params) -> std::shared_ptr<pl::ptrn::Pattern> {
auto bytes = params[0].toBytes();
auto encodingDefinition = params[1].toString();
std::string value;
EncodingFile encodingFile(EncodingFile::Type::Thingy, encodingDefinition);
auto pattern = std::make_unique<PatternEncodedString>(evaluator, evaluator->getReadOffset(), bytes.size(), 0);
auto pattern = std::make_shared<PatternEncodedString>(evaluator, evaluator->getReadOffset(), bytes.size(), 0);
pattern->setEncodedString(encodingFile, bytes);
return pattern;