]> granicus.if.org Git - php/commitdiff
fix segfault when trying to clone uncloneable object because of zend.ze1_compatibilit...
authorAntony Dovgal <tony2001@php.net>
Thu, 6 Mar 2008 17:28:26 +0000 (17:28 +0000)
committerAntony Dovgal <tony2001@php.net>
Thu, 6 Mar 2008 17:28:26 +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..1549b34
--- /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--    
+Deprecated: 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 192c4709a1b2cb6db207c17499dc3cd7efad0ec7..cfa354a8d5c6c934a21923971a4b148f4e644563 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;