From 10a1f649680971c63b110d33cffd9aa5b1aaf6a9 Mon Sep 17 00:00:00 2001 From: George Marques Date: Mon, 17 May 2021 10:59:43 -0300 Subject: GDScript: Fix crash caused by uninitialized temp stack slots This adds initialization to every typed temporary stack slot at the beginning of the function call instead of emitting instructions, since those might be in a conditional branch and not be called. --- modules/gdscript/gdscript_vm.cpp | 42 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) (limited to 'modules/gdscript/gdscript_vm.cpp') diff --git a/modules/gdscript/gdscript_vm.cpp b/modules/gdscript/gdscript_vm.cpp index 4757ec6ca9..9c1bc8217f 100644 --- a/modules/gdscript/gdscript_vm.cpp +++ b/modules/gdscript/gdscript_vm.cpp @@ -152,6 +152,44 @@ String GDScriptFunction::_get_call_error(const Callable::CallError &p_err, const return err_text; } +void (*type_init_function_table[])(Variant *) = { + nullptr, // NIL (shouldn't be called). + &VariantInitializer::init, // BOOL. + &VariantInitializer::init, // INT. + &VariantInitializer::init, // FLOAT. + &VariantInitializer::init, // STRING. + &VariantInitializer::init, // VECTOR2. + &VariantInitializer::init, // VECTOR2I. + &VariantInitializer::init, // RECT2. + &VariantInitializer::init, // RECT2I. + &VariantInitializer::init, // VECTOR3. + &VariantInitializer::init, // VECTOR3I. + &VariantInitializer::init, // TRANSFORM2D. + &VariantInitializer::init, // PLANE. + &VariantInitializer::init, // QUAT. + &VariantInitializer::init, // AABB. + &VariantInitializer::init, // BASIS. + &VariantInitializer::init, // TRANSFORM. + &VariantInitializer::init, // COLOR. + &VariantInitializer::init, // STRING_NAME. + &VariantInitializer::init, // NODE_PATH. + &VariantInitializer::init, // RID. + &VariantTypeAdjust::adjust, // OBJECT. + &VariantInitializer::init, // CALLABLE. + &VariantInitializer::init, // SIGNAL. + &VariantInitializer::init, // DICTIONARY. + &VariantInitializer::init, // ARRAY. + &VariantInitializer::init, // PACKED_BYTE_ARRAY. + &VariantInitializer::init, // PACKED_INT32_ARRAY. + &VariantInitializer::init, // PACKED_INT64_ARRAY. + &VariantInitializer::init, // PACKED_FLOAT32_ARRAY. + &VariantInitializer::init, // PACKED_FLOAT64_ARRAY. + &VariantInitializer::init, // PACKED_STRING_ARRAY. + &VariantInitializer::init, // PACKED_VECTOR2_ARRAY. + &VariantInitializer::init, // PACKED_VECTOR3_ARRAY. + &VariantInitializer::init, // PACKED_COLOR_ARRAY. +}; + #if defined(__GNUC__) #define OPCODES_TABLE \ static const void *switch_table_ops[] = { \ @@ -491,6 +529,10 @@ Variant GDScriptFunction::call(GDScriptInstance *p_instance, const Variant **p_a memnew_placement(&stack[ADDR_STACK_CLASS], Variant(script)); + for (const Map::Element *E = temporary_slots.front(); E; E = E->next()) { + type_init_function_table[E->get()](&stack[E->key()]); + } + String err_text; #ifdef DEBUG_ENABLED -- cgit v1.2.3