summaryrefslogtreecommitdiff
path: root/Zend/zend_inheritance.c
diff options
context:
space:
mode:
authorNikita Popov <nikita.ppv@gmail.com>2020-01-30 11:56:36 +0100
committerNikita Popov <nikita.ppv@gmail.com>2020-01-30 11:56:36 +0100
commitd5dd46fb0949de28631611ba30b9267bc312cbad (patch)
tree16e0b08ed56ba43cb8a031b7be91873ac53b88bc /Zend/zend_inheritance.c
parent7c34d73876296b07e0f9a9d8e54ee56250d146aa (diff)
parent68596ed71e44b64d15bb51cb67671ae8e41538f6 (diff)
downloadphp-git-d5dd46fb0949de28631611ba30b9267bc312cbad.tar.gz
Merge branch 'PHP-7.4'
* PHP-7.4: Fix copying of functions in variance obligations
Diffstat (limited to 'Zend/zend_inheritance.c')
-rw-r--r--Zend/zend_inheritance.c13
1 files changed, 11 insertions, 2 deletions
diff --git a/Zend/zend_inheritance.c b/Zend/zend_inheritance.c
index 60d7751e2d..9f61449b62 100644
--- a/Zend/zend_inheritance.c
+++ b/Zend/zend_inheritance.c
@@ -2265,8 +2265,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));
+ }
zend_hash_next_index_insert_ptr(obligations, obligation);
}