zeev Wed Feb 11 14:15:34 2004 EDT Modified files: /php-src/ext/simplexml simplexml.c Log: Prevent SimpleXML from silently modifying types of variables that are assigned to its objects. Implementation notes for overloaded object modules: - If you return a zval which is not otherwise referenced by the extension or the engine's symbol table, its reference count should be 0. - If you receive a value zval in write_property/write_dimension, you may only modify it if its reference count is 1. Otherwise, you must create a copy of that zval before making any changes. You should NOT modify the reference count of the value passed to you. Have fun! http://cvs.php.net/diff.php/php-src/ext/simplexml/simplexml.c?r1=1.127&r2=1.128&ty=u Index: php-src/ext/simplexml/simplexml.c diff -u php-src/ext/simplexml/simplexml.c:1.127 php-src/ext/simplexml/simplexml.c:1.128 --- php-src/ext/simplexml/simplexml.c:1.127 Wed Feb 11 07:19:25 2004 +++ php-src/ext/simplexml/simplexml.c Wed Feb 11 14:15:30 2004 @@ -18,7 +18,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: simplexml.c,v 1.127 2004/02/11 12:19:25 rrichards Exp $ */ +/* $Id: simplexml.c,v 1.128 2004/02/11 19:15:30 zeev Exp $ */ #ifdef HAVE_CONFIG_H #include "config.h" @@ -274,14 +274,25 @@ static void change_node_zval(xmlNodePtr node, zval *value) { + zval value_copy; + switch (Z_TYPE_P(value)) { case IS_LONG: case IS_BOOL: case IS_DOUBLE: case IS_NULL: + if (value->refcount > 1) { + value_copy = *value; + zval_copy_ctor(&value_copy); + value = &value_copy; + } convert_to_string(value); + /* break missing intentionally */ case IS_STRING: xmlNodeSetContentLen(node, Z_STRVAL_P(value), Z_STRLEN_P(value)); + if (value == &value_copy) { + zval_dtor(value); + } break; default: php_error(E_WARNING, "It is not possible to assign complex types to nodes"); @@ -1583,7 +1594,7 @@ { php_info_print_table_start(); php_info_print_table_header(2, "Simplexml support", "enabled"); - php_info_print_table_row(2, "Revision", "$Revision: 1.127 $"); + php_info_print_table_row(2, "Revision", "$Revision: 1.128 $"); php_info_print_table_row(2, "Schema support", #ifdef LIBXML_SCHEMAS_ENABLED "enabled");
-- PHP CVS Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php