]> granicus.if.org Git - php/commitdiff
MFH: fix segfault when trying to clone uncloneable object
authorAntony Dovgal <tony2001@php.net>
Thu, 6 Mar 2008 17:28:47 +0000 (17:28 +0000)
committerAntony Dovgal <tony2001@php.net>
Thu, 6 Mar 2008 17:28:47 +0000 (17:28 +0000)
Zend/tests/clone_uncloneable.phpt [new file with mode: 0644]
Zend/zend_API.c

diff --git a/Zend/tests/clone_uncloneable.phpt b/Zend/tests/clone_uncloneable.phpt
new file mode 100644 (file)
index 0000000..c991d10
--- /dev/null
@@ -0,0 +1,20 @@
+--TEST--
+cloning uncloneable object
+--SKIPIF--
+<?php if (!extension_loaded("xsl")) die("skip xsl extension is missing");?>
+--INI--
+zend.ze1_compatibility_mode=1
+--FILE--
+<?php
+
+$new = &new XSLTProcessor(); 
+var_dump($new);
+
+echo "Done\n";
+?>
+--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
index 5a4697175c3bc0d2b552ce60743fcdb0e66f6ade..2be99be25487261782b57ccd6263737cba77d7bd 100644 (file)
@@ -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;