rrichards                                Fri, 15 Jan 2010 21:29:56 +0000

Revision: http://svn.php.net/viewvc?view=revision&revision=293597

Log:
fix bug #49463 (setAttributeNS fails setting default namespace)
add test

Bug: http://bugs.php.net/49463 (Open) 
setAttributeNS("http://www.w3.org/2000/xmlns/","xmlns","blah";) produces error
      
Changed paths:
    U   php/php-src/branches/PHP_5_2/NEWS
    U   php/php-src/branches/PHP_5_2/ext/dom/element.c
    A   php/php-src/branches/PHP_5_2/ext/dom/tests/bug49463.phpt
    U   php/php-src/branches/PHP_5_3/NEWS
    U   php/php-src/branches/PHP_5_3/ext/dom/element.c
    A   php/php-src/branches/PHP_5_3/ext/dom/tests/bug49463.phpt
    U   php/php-src/trunk/ext/dom/element.c
    A   php/php-src/trunk/ext/dom/tests/bug49463.phpt

Modified: php/php-src/branches/PHP_5_2/NEWS
===================================================================
--- php/php-src/branches/PHP_5_2/NEWS	2010-01-15 21:13:25 UTC (rev 293596)
+++ php/php-src/branches/PHP_5_2/NEWS	2010-01-15 21:29:56 UTC (rev 293597)
@@ -36,6 +36,7 @@
 - Fixed bug #50394 (Reference argument converted to value in __call). (Stas)
 - Fixed bug #49851 (http wrapper breaks on 1024 char long headers). (Ilia)
 - Fixed bug #49600 (imageTTFText text shifted right). (Takeshi Abe)
+- Fixed bug #49463 (setAttributeNS fails setting default namespace). (Rob)
 - Fixed bug #48590 (SoapClient does not honor max_redirects). (Sriram)
 - Fixed bug #48190 (Content-type parameter "boundary" is not case-insensitive
   in HTTP uploads). (Ilia)

Modified: php/php-src/branches/PHP_5_2/ext/dom/element.c
===================================================================
--- php/php-src/branches/PHP_5_2/ext/dom/element.c	2010-01-15 21:13:25 UTC (rev 293596)
+++ php/php-src/branches/PHP_5_2/ext/dom/element.c	2010-01-15 21:29:56 UTC (rev 293597)
@@ -792,11 +792,17 @@
 				node_list_unlink(nodep->children TSRMLS_CC);
 			}

-			if (xmlStrEqual((xmlChar *) prefix,"xmlns") && xmlStrEqual((xmlChar *) uri, DOM_XMLNS_NAMESPACE)) {
+			if ((xmlStrEqual((xmlChar *) prefix, (xmlChar *)"xmlns") ||
+				(prefix == NULL && xmlStrEqual((xmlChar *) localname, (xmlChar *)"xmlns"))) &&
+				xmlStrEqual((xmlChar *) uri, (xmlChar *)DOM_XMLNS_NAMESPACE)) {
 				is_xmlns = 1;
-				nsptr = dom_get_nsdecl(elemp, localname);
+				if (prefix == NULL) {
+					nsptr = dom_get_nsdecl(elemp, NULL);
+				} else {
+					nsptr = dom_get_nsdecl(elemp, (xmlChar *)localname);
+				}
 			} else {
-				nsptr = xmlSearchNsByHref(elemp->doc, elemp, uri);
+				nsptr = xmlSearchNsByHref(elemp->doc, elemp, (xmlChar *)uri);
 				if (nsptr && nsptr->prefix == NULL) {
 					xmlNsPtr tmpnsptr;

@@ -817,10 +823,15 @@

 			if (nsptr == NULL) {
 				if (prefix == NULL) {
-					errorcode = NAMESPACE_ERR;
+					if (is_xmlns == 1) {
+						xmlNewNs(elemp, (xmlChar *)value, NULL);
+						xmlReconciliateNs(elemp->doc, elemp);
+					} else {
+						errorcode = NAMESPACE_ERR;
+					}
 				} else {
 					if (is_xmlns == 1) {
-						xmlNewNs(elemp, value, localname);
+						xmlNewNs(elemp, (xmlChar *)value, (xmlChar *)localname);
 					} else {
 						nsptr = dom_get_ns(elemp, uri, &errorcode, prefix);
 					}

Added: php/php-src/branches/PHP_5_2/ext/dom/tests/bug49463.phpt
===================================================================
--- php/php-src/branches/PHP_5_2/ext/dom/tests/bug49463.phpt	                        (rev 0)
+++ php/php-src/branches/PHP_5_2/ext/dom/tests/bug49463.phpt	2010-01-15 21:29:56 UTC (rev 293597)
@@ -0,0 +1,17 @@
+--TEST--
+Bug #49463 (setAttributeNS fails setting default namespace).
+--SKIPIF--
+<?php require_once('skipif.inc'); ?>
+--FILE--
+<?php
+
+$doc = new DOMDocument('1.0', 'utf-8');
+$root = $doc->createElementNS('http://purl.org/rss/1.0/','rdf:RDF');
+$doc->appendChild($root);
+$root->setAttributeNS("http://www.w3.org/2000/xmlns/","xmlns","http://purl.org/rss/1.0/"; );
+
+echo $doc->saveXML()."\n";
+?>
+--EXPECT--
+<?xml version="1.0" encoding="utf-8"?>
+<rdf:RDF xmlns:rdf="http://purl.org/rss/1.0/"; xmlns="http://purl.org/rss/1.0/"/>

Modified: php/php-src/branches/PHP_5_3/NEWS
===================================================================
--- php/php-src/branches/PHP_5_3/NEWS	2010-01-15 21:13:25 UTC (rev 293596)
+++ php/php-src/branches/PHP_5_3/NEWS	2010-01-15 21:29:56 UTC (rev 293597)
@@ -27,6 +27,7 @@
   variable does not exist). (Ilia)
 - Fixed bug #50576 (XML_OPTION_SKIP_TAGSTART option has no effect). (Pierrick)
 - Fixed bug #49560 (oci8: using LOBs causes slow PHP shutdown). (Oracle Corp.)
+- Fixed bug #49463 (setAttributeNS fails setting default namespace). (Rob)
 - Fixed bug #48590 (SoapClient does not honor max_redirects). (Sriram)
 - Fixed bug #48190 (Content-type parameter "boundary" is not case-insensitive
   in HTTP uploads). (Ilia)

Modified: php/php-src/branches/PHP_5_3/ext/dom/element.c
===================================================================
--- php/php-src/branches/PHP_5_3/ext/dom/element.c	2010-01-15 21:13:25 UTC (rev 293596)
+++ php/php-src/branches/PHP_5_3/ext/dom/element.c	2010-01-15 21:29:56 UTC (rev 293597)
@@ -777,9 +777,15 @@
 				node_list_unlink(nodep->children TSRMLS_CC);
 			}

-			if (xmlStrEqual((xmlChar *) prefix, (xmlChar *)"xmlns") && xmlStrEqual((xmlChar *) uri, (xmlChar *)DOM_XMLNS_NAMESPACE)) {
+			if ((xmlStrEqual((xmlChar *) prefix, (xmlChar *)"xmlns") ||
+				(prefix == NULL && xmlStrEqual((xmlChar *) localname, (xmlChar *)"xmlns"))) &&
+				xmlStrEqual((xmlChar *) uri, (xmlChar *)DOM_XMLNS_NAMESPACE)) {
 				is_xmlns = 1;
-				nsptr = dom_get_nsdecl(elemp, (xmlChar *)localname);
+				if (prefix == NULL) {
+					nsptr = dom_get_nsdecl(elemp, NULL);
+				} else {
+					nsptr = dom_get_nsdecl(elemp, (xmlChar *)localname);
+				}
 			} else {
 				nsptr = xmlSearchNsByHref(elemp->doc, elemp, (xmlChar *)uri);
 				if (nsptr && nsptr->prefix == NULL) {
@@ -802,7 +808,12 @@

 			if (nsptr == NULL) {
 				if (prefix == NULL) {
-					errorcode = NAMESPACE_ERR;
+					if (is_xmlns == 1) {
+						xmlNewNs(elemp, (xmlChar *)value, NULL);
+						xmlReconciliateNs(elemp->doc, elemp);
+					} else {
+						errorcode = NAMESPACE_ERR;
+					}
 				} else {
 					if (is_xmlns == 1) {
 						xmlNewNs(elemp, (xmlChar *)value, (xmlChar *)localname);

Added: php/php-src/branches/PHP_5_3/ext/dom/tests/bug49463.phpt
===================================================================
--- php/php-src/branches/PHP_5_3/ext/dom/tests/bug49463.phpt	                        (rev 0)
+++ php/php-src/branches/PHP_5_3/ext/dom/tests/bug49463.phpt	2010-01-15 21:29:56 UTC (rev 293597)
@@ -0,0 +1,17 @@
+--TEST--
+Bug #49463 (setAttributeNS fails setting default namespace).
+--SKIPIF--
+<?php require_once('skipif.inc'); ?>
+--FILE--
+<?php
+
+$doc = new DOMDocument('1.0', 'utf-8');
+$root = $doc->createElementNS('http://purl.org/rss/1.0/','rdf:RDF');
+$doc->appendChild($root);
+$root->setAttributeNS("http://www.w3.org/2000/xmlns/","xmlns","http://purl.org/rss/1.0/"; );
+
+echo $doc->saveXML()."\n";
+?>
+--EXPECT--
+<?xml version="1.0" encoding="utf-8"?>
+<rdf:RDF xmlns:rdf="http://purl.org/rss/1.0/"; xmlns="http://purl.org/rss/1.0/"/>

Modified: php/php-src/trunk/ext/dom/element.c
===================================================================
--- php/php-src/trunk/ext/dom/element.c	2010-01-15 21:13:25 UTC (rev 293596)
+++ php/php-src/trunk/ext/dom/element.c	2010-01-15 21:29:56 UTC (rev 293597)
@@ -777,9 +777,15 @@
 				node_list_unlink(nodep->children TSRMLS_CC);
 			}

-			if (xmlStrEqual((xmlChar *) prefix, (xmlChar *)"xmlns") && xmlStrEqual((xmlChar *) uri, (xmlChar *)DOM_XMLNS_NAMESPACE)) {
+			if ((xmlStrEqual((xmlChar *) prefix, (xmlChar *)"xmlns") ||
+				(prefix == NULL && xmlStrEqual((xmlChar *) localname, (xmlChar *)"xmlns"))) &&
+				xmlStrEqual((xmlChar *) uri, (xmlChar *)DOM_XMLNS_NAMESPACE)) {
 				is_xmlns = 1;
-				nsptr = dom_get_nsdecl(elemp, (xmlChar *)localname);
+				if (prefix == NULL) {
+					nsptr = dom_get_nsdecl(elemp, NULL);
+				} else {
+					nsptr = dom_get_nsdecl(elemp, (xmlChar *)localname);
+				}
 			} else {
 				nsptr = xmlSearchNsByHref(elemp->doc, elemp, (xmlChar *)uri);
 				if (nsptr && nsptr->prefix == NULL) {
@@ -802,7 +808,12 @@

 			if (nsptr == NULL) {
 				if (prefix == NULL) {
-					errorcode = NAMESPACE_ERR;
+					if (is_xmlns == 1) {
+						xmlNewNs(elemp, (xmlChar *)value, NULL);
+						xmlReconciliateNs(elemp->doc, elemp);
+					} else {
+						errorcode = NAMESPACE_ERR;
+					}
 				} else {
 					if (is_xmlns == 1) {
 						xmlNewNs(elemp, (xmlChar *)value, (xmlChar *)localname);

Added: php/php-src/trunk/ext/dom/tests/bug49463.phpt
===================================================================
--- php/php-src/trunk/ext/dom/tests/bug49463.phpt	                        (rev 0)
+++ php/php-src/trunk/ext/dom/tests/bug49463.phpt	2010-01-15 21:29:56 UTC (rev 293597)
@@ -0,0 +1,17 @@
+--TEST--
+Bug #49463 (setAttributeNS fails setting default namespace).
+--SKIPIF--
+<?php require_once('skipif.inc'); ?>
+--FILE--
+<?php
+
+$doc = new DOMDocument('1.0', 'utf-8');
+$root = $doc->createElementNS('http://purl.org/rss/1.0/','rdf:RDF');
+$doc->appendChild($root);
+$root->setAttributeNS("http://www.w3.org/2000/xmlns/","xmlns","http://purl.org/rss/1.0/"; );
+
+echo $doc->saveXML()."\n";
+?>
+--EXPECT--
+<?xml version="1.0" encoding="utf-8"?>
+<rdf:RDF xmlns:rdf="http://purl.org/rss/1.0/"; xmlns="http://purl.org/rss/1.0/"/>
-- 
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to