summaryrefslogtreecommitdiff
path: root/Zend
diff options
context:
space:
mode:
authorIlia Alshanetsky <iliaa@php.net>2007-10-04 23:23:43 +0000
committerIlia Alshanetsky <iliaa@php.net>2007-10-04 23:23:43 +0000
commit07710a5fb9f9d4ae94bdf9de677d649c6ec19258 (patch)
tree00ceb6bef950503363b00da327d2b7915594cc8e /Zend
parent1be447eb9584794d40d91fcf56b71c90d76ee46d (diff)
downloadphp-git-07710a5fb9f9d4ae94bdf9de677d649c6ec19258.tar.gz
MFB: Fixed bug #42817 (clone() on a non-object does not result in a fatal
error)
Diffstat (limited to 'Zend')
-rwxr-xr-xZend/tests/bug36071.phpt4
-rw-r--r--Zend/tests/bug42817.phpt9
-rw-r--r--Zend/tests/bug42818.phpt2
-rw-r--r--Zend/zend_vm_def.h4
-rw-r--r--Zend/zend_vm_execute.h12
5 files changed, 19 insertions, 12 deletions
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
<?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
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--
+<?php
+$a = clone(null);
+array_push($a->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 39235dba7b..514c3f299e 100644
--- a/Zend/zend_vm_def.h
+++ b/Zend/zend_vm_def.h
@@ -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();
}
diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h
index 2caa1db50e..8ce7ef9724 100644
--- a/Zend/zend_vm_execute.h
+++ b/Zend/zend_vm_execute.h
@@ -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++;