diff options
author | Nikita Popov <nikita.ppv@gmail.com> | 2020-01-30 11:56:36 +0100 |
---|---|---|
committer | Nikita Popov <nikita.ppv@gmail.com> | 2020-01-30 11:56:36 +0100 |
commit | d5dd46fb0949de28631611ba30b9267bc312cbad (patch) | |
tree | 16e0b08ed56ba43cb8a031b7be91873ac53b88bc /Zend/zend_inheritance.c | |
parent | 7c34d73876296b07e0f9a9d8e54ee56250d146aa (diff) | |
parent | 68596ed71e44b64d15bb51cb67671ae8e41538f6 (diff) | |
download | php-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.c | 13 |
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); } |