]> 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:23:43 +0000 (23:23 +0000)
committerIlia Alshanetsky <iliaa@php.net>
Thu, 4 Oct 2007 23:23:43 +0000 (23:23 +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 39235dba7b49fc8ad394891d11e68fcdd907c9bb..514c3f299e1efbc01e3220f7270eb420e4b66ec5 100644 (file)
@@ -2531,10 +2531,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 2caa1db50e6fb23053f7dc0cfc2843576de59a11..8ce7ef972488c740c896c449645c1a76ea2071a1 100644 (file)
@@ -1837,7 +1837,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++;
 
@@ -4412,10 +4412,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();
        }
 
@@ -7559,7 +7559,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);};
@@ -14719,7 +14719,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++;
 
@@ -19631,7 +19631,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++;