From 42ec1edea40b70e6f0df3fe42acde4f5512a37c9 Mon Sep 17 00:00:00 2001 From: Ilia Alshanetsky Date: Thu, 4 Oct 2007 23:25:53 +0000 Subject: [PATCH] MFB: Fixed bug #42817 (clone() on a non-object does not result in a fatal error) --- Zend/tests/bug36071.phpt | 4 +--- Zend/tests/bug42817.phpt | 9 +++++++++ Zend/tests/bug42818.phpt | 2 +- Zend/zend_vm_def.h | 4 ++-- Zend/zend_vm_execute.h | 12 ++++++------ 5 files changed, 19 insertions(+), 12 deletions(-) create mode 100644 Zend/tests/bug42817.phpt diff --git a/Zend/tests/bug36071.phpt b/Zend/tests/bug36071.phpt index 3b8e05dfab..e5146091e1 100755 --- a/Zend/tests/bug36071.phpt +++ b/Zend/tests/bug36071.phpt @@ -6,8 +6,6 @@ error_reporting=4095 b = 0; -echo "ok\n"; ?> --EXPECTF-- -Warning: __clone method called on non-object in %sbug36071.php on line 2 -ok \ No newline at end of file +Fatal error: __clone method called on non-object in %sbug36071.php on line 2 \ No newline at end of file diff --git a/Zend/tests/bug42817.phpt b/Zend/tests/bug42817.phpt new file mode 100644 index 0000000000..b1beca4d0a --- /dev/null +++ b/Zend/tests/bug42817.phpt @@ -0,0 +1,9 @@ +--TEST-- +Bug #42817 (clone() on a non-object does not result in a fatal error) +--FILE-- +b, $c); +?> +--EXPECTF-- +Fatal error: __clone method called on non-object in %sbug42817.php on line 2 diff --git a/Zend/tests/bug42818.phpt b/Zend/tests/bug42818.phpt index a1d79a41e5..09ad693b44 100644 --- a/Zend/tests/bug42818.phpt +++ b/Zend/tests/bug42818.phpt @@ -5,5 +5,5 @@ Bug #42818 ($foo = clone(array()); leaks memory) $foo = clone(array()); ?> --EXPECTF-- -Warning: __clone method called on non-object in %sbug42818.php on line 2 +Fatal error: __clone method called on non-object in %sbug42818.php on line 2 diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index 2aed1ab50a..9f060354bd 100644 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@ -2657,10 +2657,10 @@ ZEND_VM_HANDLER(110, ZEND_CLONE, CONST|TMP|VAR|UNUSED|CV, ANY) zend_object_clone_obj_t clone_call; if (!obj || Z_TYPE_P(obj) != IS_OBJECT) { - zend_error(E_WARNING, "__clone method called on non-object"); + zend_error_noreturn(E_ERROR, "__clone method called on non-object"); EX_T(opline->result.u.var).var.ptr = EG(error_zval_ptr); EX_T(opline->result.u.var).var.ptr->refcount++; - FREE_OP1(); + FREE_OP1_IF_VAR(); ZEND_VM_NEXT_OPCODE(); } diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index 0651d9939a..80bfdd2e51 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -1647,7 +1647,7 @@ static int ZEND_CLONE_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) zend_object_clone_obj_t clone_call; if (!obj || Z_TYPE_P(obj) != IS_OBJECT) { - zend_error(E_WARNING, "__clone method called on non-object"); + zend_error_noreturn(E_ERROR, "__clone method called on non-object"); EX_T(opline->result.u.var).var.ptr = EG(error_zval_ptr); EX_T(opline->result.u.var).var.ptr->refcount++; @@ -4852,10 +4852,10 @@ static int ZEND_CLONE_SPEC_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) zend_object_clone_obj_t clone_call; if (!obj || Z_TYPE_P(obj) != IS_OBJECT) { - zend_error(E_WARNING, "__clone method called on non-object"); + zend_error_noreturn(E_ERROR, "__clone method called on non-object"); EX_T(opline->result.u.var).var.ptr = EG(error_zval_ptr); EX_T(opline->result.u.var).var.ptr->refcount++; - zval_dtor(free_op1.var); + ZEND_VM_NEXT_OPCODE(); } @@ -8145,7 +8145,7 @@ static int ZEND_CLONE_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) zend_object_clone_obj_t clone_call; if (!obj || Z_TYPE_P(obj) != IS_OBJECT) { - zend_error(E_WARNING, "__clone method called on non-object"); + zend_error_noreturn(E_ERROR, "__clone method called on non-object"); EX_T(opline->result.u.var).var.ptr = EG(error_zval_ptr); EX_T(opline->result.u.var).var.ptr->refcount++; if (free_op1.var) {zval_ptr_dtor(&free_op1.var);}; @@ -16192,7 +16192,7 @@ static int ZEND_CLONE_SPEC_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS) zend_object_clone_obj_t clone_call; if (!obj || Z_TYPE_P(obj) != IS_OBJECT) { - zend_error(E_WARNING, "__clone method called on non-object"); + zend_error_noreturn(E_ERROR, "__clone method called on non-object"); EX_T(opline->result.u.var).var.ptr = EG(error_zval_ptr); EX_T(opline->result.u.var).var.ptr->refcount++; @@ -21362,7 +21362,7 @@ static int ZEND_CLONE_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) zend_object_clone_obj_t clone_call; if (!obj || Z_TYPE_P(obj) != IS_OBJECT) { - zend_error(E_WARNING, "__clone method called on non-object"); + zend_error_noreturn(E_ERROR, "__clone method called on non-object"); EX_T(opline->result.u.var).var.ptr = EG(error_zval_ptr); EX_T(opline->result.u.var).var.ptr->refcount++; -- 2.50.1