helly           Tue Dec 16 15:34:20 2003 EDT

  Added files:                 
    /php-src/ext/simplexml/tests        012.phpt 

  Modified files:              
    /php-src/ext/simplexml      simplexml.c 
  Log:
  Add error handling for element/attribute creation/changing
  
Index: php-src/ext/simplexml/simplexml.c
diff -u php-src/ext/simplexml/simplexml.c:1.92 php-src/ext/simplexml/simplexml.c:1.93
--- php-src/ext/simplexml/simplexml.c:1.92      Tue Dec 16 12:14:05 2003
+++ php-src/ext/simplexml/simplexml.c   Tue Dec 16 15:34:18 2003
@@ -17,7 +17,7 @@
   +----------------------------------------------------------------------+
 */
 
-/* $Id: simplexml.c,v 1.92 2003/12/16 17:14:05 iliaa Exp $ */
+/* $Id: simplexml.c,v 1.93 2003/12/16 20:34:18 helly Exp $ */
 
 #ifdef HAVE_CONFIG_H
 #include "config.h"
@@ -28,6 +28,7 @@
 
 #include "php_ini.h"
 #include "ext/standard/info.h"
+#include "ext/standard/php_string.h"
 #include "php_simplexml.h"
 
 #if HAVE_SPL
@@ -279,13 +280,32 @@
        xmlAttrPtr      attr = NULL;
        int             counter = 0;
        int             is_attr = 0;
-       zval            tmp_zv;
+       zval            tmp_zv, trim_zv;
+
+       if (!member) {
+               /* this happens when the user did: $sxe[] = $value
+                * and could also be E_PARSE, but use this only during parsing
+                * but this is during runtime.
+                */
+               php_error_docref(NULL TSRMLS_CC, E_ERROR, "Cannot create unnamed 
attribute");
+               return;
+       }
 
        if (Z_TYPE_P(member) != IS_STRING) {
-               tmp_zv = *member;
-               zval_copy_ctor(&tmp_zv);
+               trim_zv = *member;
+               zval_copy_ctor(&trim_zv);
+               convert_to_string(&trim_zv);
+               php_trim(Z_STRVAL(trim_zv), Z_STRLEN(trim_zv), NULL, 0, &tmp_zv, 3 
TSRMLS_CC);
+               zval_dtor(&trim_zv);
                member = &tmp_zv;
-               convert_to_string(member);
+       }
+
+       if (!Z_STRLEN_P(member)) {
+               php_error_docref(NULL TSRMLS_CC, E_WARNING, "Cannot write or create 
unnamed %s", attribs ? "attribute" : "element");
+               if (member == &tmp_zv) {
+                       zval_dtor(&tmp_zv);
+               }
+               return;
        }
 
        name = Z_STRVAL_P(member);
@@ -1567,7 +1587,7 @@
 {
        php_info_print_table_start();
        php_info_print_table_header(2, "Simplexml support", "enabled");
-       php_info_print_table_row(2, "Revision", "$Revision: 1.92 $");
+       php_info_print_table_row(2, "Revision", "$Revision: 1.93 $");
        php_info_print_table_row(2, "Schema support", 
 #ifdef LIBXML_SCHEMAS_ENABLED
                "enabled");

Index: php-src/ext/simplexml/tests/012.phpt
+++ php-src/ext/simplexml/tests/012.phpt
--TEST--
SimpleXML and Attribute creation
--SKIPIF--
<?php 
        if (!extension_loaded('simplexml')) print 'skip';
        if (!class_exists('RecursiveIteratorIterator')) print 'skip 
RecursiveIteratorIterator not available';
?>
--FILE--
<?php 

$xml =<<<EOF
<?xml version="1.0" encoding="ISO-8859-1" ?>
<foo/>
EOF;

$sxe = simplexml_load_string($xml);


$sxe[""] = "warning";
$sxe["attr"] = "value";

echo $sxe->to_xml_string();

$sxe["attr"] = "new value";

echo $sxe->to_xml_string();

$sxe[] = "error";

?>
===DONE===
--EXPECTF--

Warning: main(): Cannot write or create unnamed attribute in %s012.php on line %d
<?xml version="1.0" encoding="ISO-8859-1"?>
<foo attr="value"/>
<?xml version="1.0" encoding="ISO-8859-1"?>
<foo attr="new value"/>

Fatal error: main(): Cannot create unnamed attribute in %s012.php on line %d

-- 
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to