From 53d8a83def11f29593f756eef376bb194e26cfa1 Mon Sep 17 00:00:00 2001 From: George Peter Banyard Date: Wed, 2 Nov 2022 15:19:21 +0000 Subject: [PATCH 1/2] User zend_call_known_instance_method() instead of building FCI/FCC in serializer subroutine --- ext/standard/var.c | 19 ++----------------- 1 file changed, 2 insertions(+), 17 deletions(-) diff --git a/ext/standard/var.c b/ext/standard/var.c index e98cb99cf582..0140fa75a7a4 100644 --- a/ext/standard/var.c +++ b/ext/standard/var.c @@ -764,28 +764,13 @@ static inline bool php_var_serialize_class_name(smart_str *buf, zval *struc) /* static HashTable* php_var_serialize_call_sleep(zend_object *obj, zend_function *fn) /* {{{ */ { - zend_result res; - zend_fcall_info fci; - zend_fcall_info_cache fci_cache; zval retval; - fci.size = sizeof(fci); - fci.object = obj; - fci.retval = &retval; - fci.param_count = 0; - fci.params = NULL; - fci.named_params = NULL; - ZVAL_UNDEF(&fci.function_name); - - fci_cache.function_handler = fn; - fci_cache.object = obj; - fci_cache.called_scope = obj->ce; - BG(serialize_lock)++; - res = zend_call_function(&fci, &fci_cache); + zend_call_known_instance_method(fn, obj, &retval, /* param_count */ 0, /* params */ NULL); BG(serialize_lock)--; - if (res == FAILURE || Z_ISUNDEF(retval)) { + if (Z_ISUNDEF(retval)) { zval_ptr_dtor(&retval); return NULL; } From 7f90379b3a18534f8476fc6cef563d448b0f8632 Mon Sep 17 00:00:00 2001 From: George Peter Banyard Date: Sun, 5 Feb 2023 17:14:02 +0000 Subject: [PATCH 2/2] Fail if an exception is raised Co-authored-by: Tyson Andre --- ext/standard/var.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ext/standard/var.c b/ext/standard/var.c index 0140fa75a7a4..9c8cadb3208c 100644 --- a/ext/standard/var.c +++ b/ext/standard/var.c @@ -770,7 +770,7 @@ static HashTable* php_var_serialize_call_sleep(zend_object *obj, zend_function * zend_call_known_instance_method(fn, obj, &retval, /* param_count */ 0, /* params */ NULL); BG(serialize_lock)--; - if (Z_ISUNDEF(retval)) { + if (Z_ISUNDEF(retval) || EG(exception)) { zval_ptr_dtor(&retval); return NULL; }