From: Nikita Popov Date: Thu, 30 Jan 2020 10:55:38 +0000 (+0100) Subject: Fix copying of functions in variance obligations X-Git-Tag: php-7.4.7RC1~247 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=68596ed71e44b64d15bb51cb67671ae8e41538f6;p=php Fix copying of functions in variance obligations Only copy sizeof(zend_internal_function) for internal functions. --- diff --git a/Zend/tests/type_declarations/variance/internal_parent.phpt b/Zend/tests/type_declarations/variance/internal_parent.phpt new file mode 100644 index 0000000000..eaef902b66 --- /dev/null +++ b/Zend/tests/type_declarations/variance/internal_parent.phpt @@ -0,0 +1,12 @@ +--TEST-- +Internal class as parent +--FILE-- + +--EXPECTF-- +Warning: Could not check compatibility between Test::createFromFormat($format, $time, ?Wrong $timezone = NULL) and DateTime::createFromFormat($format, $time, ?DateTimeZone $object = NULL), because class Wrong is not available in %s on line %d diff --git a/Zend/zend_inheritance.c b/Zend/zend_inheritance.c index 442ab8afc1..6bd35a6bb7 100644 --- a/Zend/zend_inheritance.c +++ b/Zend/zend_inheritance.c @@ -2294,8 +2294,17 @@ static void add_compatibility_obligation( HashTable *obligations = get_or_init_obligations_for_class(ce); variance_obligation *obligation = emalloc(sizeof(variance_obligation)); obligation->type = OBLIGATION_COMPATIBILITY; - obligation->child_fn = *child_fn; - obligation->parent_fn = *parent_fn; + /* Copy functions, because they may be stack-allocated in the case of traits. */ + if (child_fn->common.type == ZEND_INTERNAL_FUNCTION) { + memcpy(&obligation->child_fn, child_fn, sizeof(zend_internal_function)); + } else { + memcpy(&obligation->child_fn, child_fn, sizeof(zend_op_array)); + } + if (parent_fn->common.type == ZEND_INTERNAL_FUNCTION) { + memcpy(&obligation->parent_fn, parent_fn, sizeof(zend_internal_function)); + } else { + memcpy(&obligation->parent_fn, parent_fn, sizeof(zend_op_array)); + } obligation->always_error = always_error; zend_hash_next_index_insert_ptr(obligations, obligation); }