diff options
author | Rémi Verschelde <rverschelde@gmail.com> | 2024-04-15 13:41:20 +0200 |
---|---|---|
committer | Rémi Verschelde <rverschelde@gmail.com> | 2024-04-15 13:41:20 +0200 |
commit | b8fa48be040890f344a5178cf0fb9ea69c24f88e (patch) | |
tree | 29d7c37990710ae8c2a11ebd474f17f93fce354b | |
parent | 0ec66a1097a494b7b61a94dca7eceb968b15a380 (diff) | |
parent | 3c62f5fe5cbf0b6a1210d73a42fc247818107df0 (diff) | |
download | redot-engine-b8fa48be040890f344a5178cf0fb9ea69c24f88e.tar.gz |
Merge pull request #90693 from dalexeev/core-marshalls-fix-refc-handling
Core: Fix `RefCounted` handling in `marshalls.cpp`
-rw-r--r-- | core/io/marshalls.cpp | 20 |
1 files changed, 12 insertions, 8 deletions
diff --git a/core/io/marshalls.cpp b/core/io/marshalls.cpp index 4487b8e472..c9493be4ef 100644 --- a/core/io/marshalls.cpp +++ b/core/io/marshalls.cpp @@ -656,10 +656,19 @@ Error decode_variant(Variant &r_variant, const uint8_t *p_buffer, int p_len, int ERR_FAIL_COND_V(!ClassDB::can_instantiate(str), ERR_INVALID_DATA); Object *obj = ClassDB::instantiate(str); - ERR_FAIL_NULL_V(obj, ERR_UNAVAILABLE); - ERR_FAIL_COND_V(len < 4, ERR_INVALID_DATA); + // Avoid premature free `RefCounted`. This must be done before properties are initialized, + // since script functions (setters, implicit initializer) may be called. See GH-68666. + Variant variant; + if (Object::cast_to<RefCounted>(obj)) { + Ref<RefCounted> ref = Ref<RefCounted>(Object::cast_to<RefCounted>(obj)); + variant = ref; + } else { + variant = obj; + } + + ERR_FAIL_COND_V(len < 4, ERR_INVALID_DATA); int32_t count = decode_uint32(buf); buf += 4; len -= 4; @@ -699,12 +708,7 @@ Error decode_variant(Variant &r_variant, const uint8_t *p_buffer, int p_len, int } } - if (Object::cast_to<RefCounted>(obj)) { - Ref<RefCounted> ref = Ref<RefCounted>(Object::cast_to<RefCounted>(obj)); - r_variant = ref; - } else { - r_variant = obj; - } + r_variant = variant; } } |