]> granicus.if.org Git - php/commitdiff
MFB: Fixed bug #42817 (clone() on a non-object does not result in a fatal
authorIlia Alshanetsky <iliaa@php.net>
Thu, 4 Oct 2007 23:25:53 +0000 (23:25 +0000)
committerIlia Alshanetsky <iliaa@php.net>
Thu, 4 Oct 2007 23:25:53 +0000 (23:25 +0000)
error)

Zend/tests/bug36071.phpt
Zend/tests/bug42817.phpt [new file with mode: 0644]
Zend/tests/bug42818.phpt
Zend/zend_vm_def.h
Zend/zend_vm_execute.h

index 3b8e05dfab53218e3ff0ff5e9677d0276ffb6bd0..e5146091e134327d57e6f25a96f135f705b7a9bb 100755 (executable)
@@ -6,8 +6,6 @@ error_reporting=4095
 <?php
 $a = clone 0;
 $a[0]->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 (file)
index 0000000..b1beca4
--- /dev/null
@@ -0,0 +1,9 @@
+--TEST--
+Bug #42817 (clone() on a non-object does not result in a fatal error)
+--FILE--
+<?php
+$a = clone(null);
+array_push($a->b, $c);
+?>
+--EXPECTF--
+Fatal error: __clone method called on non-object in %sbug42817.php on line 2
index a1d79a41e5688229e3a566eafd12a59f1007aa56..09ad693b44adce9dd508c41d82c7e3afad7ae73d 100644 (file)
@@ -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
 
index 2aed1ab50a81b0dc34c15c74f3c51698ed7a9cff..9f060354bdbb8a834c0b53f36153fc748c5683ba 100644 (file)
@@ -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();
        }
 
index 0651d9939ac2a807978d6f91189344ebd99d7a52..80bfdd2e51242a440c285f57f15282fd15987b94 100644 (file)
@@ -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++;