rrichards Fri Mar 3 20:15:10 2006 UTC Added files: (Branch: PHP_5_1) /php-src/ext/dom/tests dom007.phpt
Modified files: /php-src/ext/dom dom_iterators.c namednodemap.c notation.c Log: fix crashes using notations and entity decls add test
http://cvs.php.net/viewcvs.cgi/php-src/ext/dom/dom_iterators.c?r1=1.9.2.2&r2=1.9.2.3&diff_format=u Index: php-src/ext/dom/dom_iterators.c diff -u php-src/ext/dom/dom_iterators.c:1.9.2.2 php-src/ext/dom/dom_iterators.c:1.9.2.3 --- php-src/ext/dom/dom_iterators.c:1.9.2.2 Sun Jan 1 12:50:06 2006 +++ php-src/ext/dom/dom_iterators.c Fri Mar 3 20:15:10 2006 @@ -17,7 +17,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: dom_iterators.c,v 1.9.2.2 2006/01/01 12:50:06 sniper Exp $ */ +/* $Id: dom_iterators.c,v 1.9.2.3 2006/03/03 20:15:10 rrichards Exp $ */ #ifdef HAVE_CONFIG_H #include "config.h" @@ -200,7 +200,8 @@ curobj = iterator->curobj; intern = (dom_object *)zend_object_store_get_object(curobj TSRMLS_CC); if (intern != NULL && intern->ptr != NULL) { - if (objmap->ht == NULL) { + if (objmap->nodetype != XML_ENTITY_NODE && + objmap->nodetype != XML_NOTATION_NODE) { if (objmap->nodetype == DOM_NODESET) { nodeht = HASH_OF(objmap->baseobjptr); zend_hash_move_forward(nodeht); @@ -210,12 +211,14 @@ } } else { curnode = (xmlNodePtr)((php_libxml_node_ptr *)intern->ptr)->node; - if (objmap->nodetype == XML_ATTRIBUTE_NODE || objmap->nodetype == XML_ELEMENT_NODE) { + if (objmap->nodetype == XML_ATTRIBUTE_NODE || + objmap->nodetype == XML_ELEMENT_NODE) { curnode = curnode->next; } else { /* Nav the tree evey time as this is LIVE */ basenode = dom_object_get_node(objmap->baseobj); - if (basenode && (basenode->type == XML_DOCUMENT_NODE || basenode->type == XML_HTML_DOCUMENT_NODE)) { + if (basenode && (basenode->type == XML_DOCUMENT_NODE || + basenode->type == XML_HTML_DOCUMENT_NODE)) { basenode = xmlDocGetRootElement((xmlDoc *) basenode); } else { basenode = basenode->children; @@ -225,9 +228,9 @@ } } else { if (objmap->nodetype == XML_ENTITY_NODE) { - curnode = php_dom_libxml_hash_iter(objmap->ht, iter->index); + curnode = php_dom_libxml_hash_iter(objmap->ht, iter->index - 1); } else { - curnode = php_dom_libxml_notation_iter(objmap->ht, iter->index); + curnode = php_dom_libxml_notation_iter(objmap->ht, iter->index - 1); } } } @@ -269,7 +272,8 @@ intern = (dom_object *)zend_object_store_get_object(object TSRMLS_CC); objmap = (dom_nnodemap_object *)intern->ptr; if (objmap != NULL) { - if (objmap->ht == NULL) { + if (objmap->nodetype != XML_ENTITY_NODE && + objmap->nodetype != XML_NOTATION_NODE) { if (objmap->nodetype == DOM_NODESET) { nodeht = HASH_OF(objmap->baseobjptr); zend_hash_internal_pointer_reset(nodeht); @@ -295,7 +299,11 @@ } } } else { - curnode = php_dom_libxml_hash_iter(objmap->ht, 0); + if (objmap->nodetype == XML_ENTITY_NODE) { + curnode = php_dom_libxml_hash_iter(objmap->ht, 0); + } else { + curnode = php_dom_libxml_notation_iter(objmap->ht, 0); + } } } http://cvs.php.net/viewcvs.cgi/php-src/ext/dom/namednodemap.c?r1=1.15.2.1&r2=1.15.2.2&diff_format=u Index: php-src/ext/dom/namednodemap.c diff -u php-src/ext/dom/namednodemap.c:1.15.2.1 php-src/ext/dom/namednodemap.c:1.15.2.2 --- php-src/ext/dom/namednodemap.c:1.15.2.1 Sun Jan 1 12:50:06 2006 +++ php-src/ext/dom/namednodemap.c Fri Mar 3 20:15:10 2006 @@ -17,7 +17,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: namednodemap.c,v 1.15.2.1 2006/01/01 12:50:06 sniper Exp $ */ +/* $Id: namednodemap.c,v 1.15.2.2 2006/03/03 20:15:10 rrichards Exp $ */ #ifdef HAVE_CONFIG_H #include "config.h" @@ -61,8 +61,11 @@ objmap = (dom_nnodemap_object *)obj->ptr; if (objmap != NULL) { - if (objmap->ht) { - count = xmlHashSize(objmap->ht); + if ((objmap->nodetype == XML_NOTATION_NODE) || + objmap->nodetype == XML_ENTITY_NODE) { + if (objmap->ht) { + count = xmlHashSize(objmap->ht); + } } else { nodep = dom_object_get_node(objmap->baseobj); if (nodep) { @@ -113,12 +116,17 @@ objmap = (dom_nnodemap_object *)intern->ptr; if (objmap != NULL) { - if (objmap->ht) { - if (objmap->nodetype == XML_ENTITY_NODE) { - itemnode = (xmlNodePtr)xmlHashLookup(objmap->ht, named); - } else { - notep = (xmlNotation *)xmlHashLookup(objmap->ht, named); - itemnode = create_notation(notep->name, notep->PublicID, notep->SystemID); + if ((objmap->nodetype == XML_NOTATION_NODE) || + objmap->nodetype == XML_ENTITY_NODE) { + if (objmap->ht) { + if (objmap->nodetype == XML_ENTITY_NODE) { + itemnode = (xmlNodePtr)xmlHashLookup(objmap->ht, named); + } else { + notep = (xmlNotation *)xmlHashLookup(objmap->ht, named); + if (notep) { + itemnode = create_notation(notep->name, notep->PublicID, notep->SystemID); + } + } } } else { nodep = dom_object_get_node(objmap->baseobj); @@ -185,11 +193,14 @@ objmap = (dom_nnodemap_object *)intern->ptr; if (objmap != NULL) { - if (objmap->ht) { - if (objmap->nodetype == XML_ENTITY_NODE) { - itemnode = php_dom_libxml_hash_iter(objmap->ht, index); - } else { - itemnode = php_dom_libxml_notation_iter(objmap->ht, index); + if ((objmap->nodetype == XML_NOTATION_NODE) || + objmap->nodetype == XML_ENTITY_NODE) { + if (objmap->ht) { + if (objmap->nodetype == XML_ENTITY_NODE) { + itemnode = php_dom_libxml_hash_iter(objmap->ht, index); + } else { + itemnode = php_dom_libxml_notation_iter(objmap->ht, index); + } } } else { nodep = dom_object_get_node(objmap->baseobj); @@ -241,12 +252,17 @@ objmap = (dom_nnodemap_object *)intern->ptr; if (objmap != NULL) { - if (objmap->ht) { - if (objmap->nodetype == XML_ENTITY_NODE) { - itemnode = (xmlNodePtr)xmlHashLookup(objmap->ht, named); - } else { - notep = (xmlNotation *)xmlHashLookup(objmap->ht, named); - itemnode = create_notation(notep->name, notep->PublicID, notep->SystemID); + if ((objmap->nodetype == XML_NOTATION_NODE) || + objmap->nodetype == XML_ENTITY_NODE) { + if (objmap->ht) { + if (objmap->nodetype == XML_ENTITY_NODE) { + itemnode = (xmlNodePtr)xmlHashLookup(objmap->ht, named); + } else { + notep = (xmlNotation *)xmlHashLookup(objmap->ht, named); + if (notep) { + itemnode = create_notation(notep->name, notep->PublicID, notep->SystemID); + } + } } } else { nodep = dom_object_get_node(objmap->baseobj); http://cvs.php.net/viewcvs.cgi/php-src/ext/dom/notation.c?r1=1.9.2.1&r2=1.9.2.2&diff_format=u Index: php-src/ext/dom/notation.c diff -u php-src/ext/dom/notation.c:1.9.2.1 php-src/ext/dom/notation.c:1.9.2.2 --- php-src/ext/dom/notation.c:1.9.2.1 Sun Jan 1 12:50:06 2006 +++ php-src/ext/dom/notation.c Fri Mar 3 20:15:10 2006 @@ -17,7 +17,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: notation.c,v 1.9.2.1 2006/01/01 12:50:06 sniper Exp $ */ +/* $Id: notation.c,v 1.9.2.2 2006/03/03 20:15:10 rrichards Exp $ */ #ifdef HAVE_CONFIG_H #include "config.h" @@ -48,9 +48,9 @@ */ int dom_notation_public_id_read(dom_object *obj, zval **retval TSRMLS_DC) { - xmlNotationPtr nodep; + xmlEntityPtr nodep; - nodep = (xmlNotationPtr) dom_object_get_node(obj); + nodep = (xmlEntityPtr) dom_object_get_node(obj); if (nodep == NULL) { php_dom_throw_error(INVALID_STATE_ERR, 0 TSRMLS_CC); @@ -58,8 +58,8 @@ } ALLOC_ZVAL(*retval); - if (nodep->PublicID) { - ZVAL_STRING(*retval, (char *) (nodep->PublicID), 1); + if (nodep->ExternalID) { + ZVAL_STRING(*retval, (char *) (nodep->ExternalID), 1); } else { ZVAL_EMPTY_STRING(*retval); } @@ -78,9 +78,9 @@ */ int dom_notation_system_id_read(dom_object *obj, zval **retval TSRMLS_DC) { - xmlNotationPtr nodep; + xmlEntityPtr nodep; - nodep = (xmlNotationPtr) dom_object_get_node(obj); + nodep = (xmlEntityPtr) dom_object_get_node(obj); if (nodep == NULL) { php_dom_throw_error(INVALID_STATE_ERR, 0 TSRMLS_CC); @@ -89,7 +89,7 @@ ALLOC_ZVAL(*retval); if (nodep->SystemID) { - ZVAL_STRING(*retval, (char *) (nodep->PublicID), 1); + ZVAL_STRING(*retval, (char *) (nodep->SystemID), 1); } else { ZVAL_EMPTY_STRING(*retval); } http://cvs.php.net/viewcvs.cgi/php-src/ext/dom/tests/dom007.phpt?view=markup&rev=1.1 Index: php-src/ext/dom/tests/dom007.phpt +++ php-src/ext/dom/tests/dom007.phpt --TEST-- Test 7: DTD tests --SKIPIF-- <?php require_once('skipif.inc'); ?> --FILE-- <?php $xml = <<< EOXML <?xml version="1.0" encoding="ISO-8859-1"?> <!DOCTYPE courses [ <!ELEMENT courses (course+)> <!ELEMENT course (title, description, temp*)> <!ATTLIST course cid ID #REQUIRED> <!ELEMENT title (#PCDATA)> <!ELEMENT description (#PCDATA)> <!ELEMENT temp (#PCDATA)> <!ATTLIST temp vid ID #REQUIRED> <!ENTITY test 'http://www.hpl.hp.com/semweb/2003/query_tester#'> <!ENTITY rdf 'http://www.w3.org/1999/02/22-rdf-syntax-ns#'> <!NOTATION GIF PUBLIC "-" "image/gif"> <!ENTITY myimage PUBLIC "-" "mypicture.gif" NDATA GIF> ]> <courses> <course cid="c1"> <title>Basic Languages</title> <description>Introduction to Languages</description> </course> <course cid="c6"> <title>French I</title> <description>Introduction to French</description> <temp vid="c7"> </temp> </course> </courses> EOXML; $dom = new DOMDocument(); $dom->loadXML($xml); $dtd = $dom->doctype; /* Notation Tests */ $nots = $dtd->notations; $length = $nots->length; echo "Length: ".$length."\n"; foreach ($nots AS $key=>$node) { echo "Key $key: ".$node->nodeName." (".$node->systemId.") (".$node->publicId.")\n"; } print "\n"; for($x=0; $x < $length; $x++) { echo "Index $x: ".$nots->item($x)->nodeName." (".$nots->item($x)->systemId.") (".$nots->item($x)->publicId.")\n"; } echo "\n"; $node = $nots->getNamedItem('xxx'); var_dump($node); echo "\n"; /* Entity Decl Tests */ $ents = $dtd->entities; $length = $ents->length; echo "Length: ".$length."\n"; foreach ($ents AS $key=>$node) { echo "Key: $key Name: ".$node->nodeName."\n"; } echo "\n"; for($x=0; $x < $length; $x++) { echo "Index $x: ".$ents->item($x)->nodeName."\n"; } echo "\n"; $node = $ents->item(3); var_dump($node); $node = $ents->getNamedItem('xxx'); var_dump($node); --EXPECT-- Length: 1 Key GIF: GIF (image/gif) (-) Index 0: GIF (image/gif) (-) NULL Length: 3 Key: test Name: test Key: rdf Name: rdf Key: myimage Name: myimage Index 0: test Index 1: rdf Index 2: myimage NULL NULL
-- PHP CVS Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php