From ba9ad966c3895f2d7af2ec28a18d0034db1554eb Mon Sep 17 00:00:00 2001 From: Antony Dovgal Date: Thu, 6 Mar 2008 17:28:47 +0000 Subject: [PATCH] MFH: fix segfault when trying to clone uncloneable object --- Zend/tests/clone_uncloneable.phpt | 20 ++++++++++++++++++++ Zend/zend_API.c | 6 ++++++ 2 files changed, 26 insertions(+) create mode 100644 Zend/tests/clone_uncloneable.phpt diff --git a/Zend/tests/clone_uncloneable.phpt b/Zend/tests/clone_uncloneable.phpt new file mode 100644 index 0000000000..c991d10600 --- /dev/null +++ b/Zend/tests/clone_uncloneable.phpt @@ -0,0 +1,20 @@ +--TEST-- +cloning uncloneable object +--SKIPIF-- + +--INI-- +zend.ze1_compatibility_mode=1 +--FILE-- + +--EXPECTF-- +Strict Standards: Assigning the return value of new by reference is deprecated in %s on line %d + +Strict Standards: Implicit cloning object of class 'XSLTProcessor' because of 'zend.ze1_compatibility_mode' in %s on line %d + +Fatal error: Trying to clone uncloneable object of class XSLTProcessor in Unknown on line 0 diff --git a/Zend/zend_API.c b/Zend/zend_API.c index 5a4697175c..2be99be254 100644 --- a/Zend/zend_API.c +++ b/Zend/zend_API.c @@ -168,9 +168,15 @@ ZEND_API int _zend_get_parameters_array_ex(int param_count, zval ***argument_arr *value_ptr = **value; INIT_PZVAL(value_ptr); zend_error(E_STRICT, "Implicit cloning object of class '%s' because of 'zend.ze1_compatibility_mode'", class_name); + + if (Z_OBJ_HANDLER_PP(value, clone_obj) == NULL) { + zend_error(E_CORE_ERROR, "Trying to clone uncloneable object of class %s", class_name); + } + if(!dup) { efree(class_name); } + value_ptr->value.obj = Z_OBJ_HANDLER_PP(value, clone_obj)(*value TSRMLS_CC); zval_ptr_dtor(value); *value = value_ptr; -- 2.40.0