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

Reply via email to