summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRémi Verschelde <rverschelde@gmail.com>2024-04-15 13:41:20 +0200
committerRémi Verschelde <rverschelde@gmail.com>2024-04-15 13:41:20 +0200
commitb8fa48be040890f344a5178cf0fb9ea69c24f88e (patch)
tree29d7c37990710ae8c2a11ebd474f17f93fce354b
parent0ec66a1097a494b7b61a94dca7eceb968b15a380 (diff)
parent3c62f5fe5cbf0b6a1210d73a42fc247818107df0 (diff)
downloadredot-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.cpp20
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;
}
}