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

Reply via email to