rrichards Thu Oct 27 19:49:38 2005 EDT
Added files:
/php-src/ext/dom/tests dom_set_attr_node.phpt
Modified files:
/php-src/ext/dom element.c
Log:
fix crash setting attr from foreign doc (throws exception)
add test
http://cvs.php.net/diff.php/php-src/ext/dom/element.c?r1=1.38&r2=1.39&ty=u
Index: php-src/ext/dom/element.c
diff -u php-src/ext/dom/element.c:1.38 php-src/ext/dom/element.c:1.39
--- php-src/ext/dom/element.c:1.38 Sun Aug 28 12:22:02 2005
+++ php-src/ext/dom/element.c Thu Oct 27 19:49:34 2005
@@ -17,7 +17,7 @@
+----------------------------------------------------------------------+
*/
-/* $Id: element.c,v 1.38 2005/08/28 16:22:02 rrichards Exp $ */
+/* $Id: element.c,v 1.39 2005/10/27 23:49:34 rrichards Exp $ */
#ifdef HAVE_CONFIG_H
#include "config.h"
@@ -368,6 +368,11 @@
RETURN_FALSE;
}
+ if (!(attrp->doc == NULL || attrp->doc == nodep->doc)) {
+ php_dom_throw_error(WRONG_DOCUMENT_ERR,
dom_get_strict_error(intern->document) TSRMLS_CC);
+ RETURN_FALSE;
+ }
+
existattrp = xmlHasProp(nodep, attrp->name);
if (existattrp != NULL && existattrp->type != XML_ATTRIBUTE_DECL) {
if ((oldobj = php_dom_object_get_data((xmlNodePtr) existattrp))
!= NULL &&
@@ -769,6 +774,11 @@
RETURN_FALSE;
}
+ if (!(attrp->doc == NULL || attrp->doc == nodep->doc)) {
+ php_dom_throw_error(WRONG_DOCUMENT_ERR,
dom_get_strict_error(intern->document) TSRMLS_CC);
+ RETURN_FALSE;
+ }
+
nsp = attrp->ns;
if (nsp != NULL) {
existattrp = xmlHasNsProp(nodep, nsp->href, attrp->name);
http://cvs.php.net/co.php/php-src/ext/dom/tests/dom_set_attr_node.phpt?r=1.1&p=1
Index: php-src/ext/dom/tests/dom_set_attr_node.phpt
+++ php-src/ext/dom/tests/dom_set_attr_node.phpt
--TEST--
Test: setAttributeNode()
--SKIPIF--
<?php require_once('skipif.inc'); ?>
--FILE--
<?php
$xml = <<<HERE
<?xml version="1.0" ?>
<root a="b" />
HERE;
$xml2 = <<<HERE
<?xml version="1.0" ?>
<doc2 />
HERE;
$dom = new DOMDocument();
$dom->loadXML($xml);
$root = $dom->documentElement;
$attr = $root->getAttributeNode('a');
$dom2 = new DOMDocument();
$dom2->loadXML($xml2);
$root2 = $dom2->documentElement;
try {
$root2->setAttributeNode($attr);
} catch (domexception $e) {
var_dump($e);
}
?>
--EXPECTF--
object(DOMException)#%d (6) {
["message":protected]=>
string(20) "Wrong Document Error"
["string":"Exception":private]=>
string(0) ""
["file":protected]=>
string(%d) "%sdom_set_attr_node.php"
["line":protected]=>
int(22)
["trace":"Exception":private]=>
array(1) {
[0]=>
array(6) {
["file"]=>
string(%d) "%sdom_set_attr_node.php"
["line"]=>
int(22)
["function"]=>
string(16) "setAttributeNode"
["class"]=>
string(10) "DOMElement"
["type"]=>
string(2) "->"
["args"]=>
array(1) {
[0]=>
object(DOMAttr)#%d (0) {
}
}
}
}
["code"]=>
int(4)
}
--UEXPECTF--
object(DOMException)#%d (6) {
[u"message":protected]=>
unicode(20) "Wrong Document Error"
[u"string":u"Exception":private]=>
unicode(0) ""
[u"file":protected]=>
unicode(%d) "%sdom_set_attr_node.php"
[u"line":protected]=>
int(22)
[u"trace":u"Exception":private]=>
array(1) {
[0]=>
array(6) {
[u"file"]=>
unicode(%d) "%sdom_set_attr_node.php"
[u"line"]=>
int(22)
[u"function"]=>
unicode(16) "setAttributeNode"
[u"class"]=>
unicode(10) "DOMElement"
[u"type"]=>
unicode(2) "->"
[u"args"]=>
array(1) {
[0]=>
object(DOMAttr)#%d (0) {
}
}
}
}
["code"]=>
int(4)
}
--
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php