From 06028e4c7fb563677717ed7fdbfe63de65f9f392 Mon Sep 17 00:00:00 2001 From: Chris Wright Date: Tue, 19 Aug 2014 13:18:22 +0100 Subject: [PATCH] Add DOMXPath::$enableRegisterNodeNS property Fix for bug #55700 --- ext/dom/dom_properties.h | 2 ++ ext/dom/php_dom.c | 2 ++ ext/dom/php_dom.h | 1 + ext/dom/tests/bug55700.phpt | 34 ++++++++++++++++++++++++++++++++++ ext/dom/xpath.c | 24 ++++++++++++++++++++++++ 5 files changed, 63 insertions(+) create mode 100644 ext/dom/tests/bug55700.phpt diff --git a/ext/dom/dom_properties.h b/ext/dom/dom_properties.h index a658b1d843e8c..ecf1be72f89c3 100644 --- a/ext/dom/dom_properties.h +++ b/ext/dom/dom_properties.h @@ -157,6 +157,8 @@ int dom_typeinfo_type_namespace_read(dom_object *obj, zval **retval TSRMLS_DC); #if defined(LIBXML_XPATH_ENABLED) /* xpath properties */ int dom_xpath_document_read(dom_object *obj, zval **retval TSRMLS_DC); +int dom_xpath_enable_register_node_ns_read(dom_object *obj, zval **retval TSRMLS_DC); +int dom_xpath_enable_register_node_ns_write(dom_object *obj, zval *newval TSRMLS_DC); #endif #endif /* DOM_PROPERTIERS_H */ diff --git a/ext/dom/php_dom.c b/ext/dom/php_dom.c index a9621eeb4c555..acdfce8e276ab 100644 --- a/ext/dom/php_dom.c +++ b/ext/dom/php_dom.c @@ -902,6 +902,7 @@ PHP_MINIT_FUNCTION(dom) zend_hash_init(&dom_xpath_prop_handlers, 0, NULL, NULL, 1); dom_register_prop_handler(&dom_xpath_prop_handlers, "document", dom_xpath_document_read, NULL TSRMLS_CC); + dom_register_prop_handler(&dom_xpath_prop_handlers, "enableRegisterNodeNS", dom_xpath_enable_register_node_ns_read, dom_xpath_enable_register_node_ns_write TSRMLS_CC); zend_hash_add(&classes, ce.name, ce.name_length + 1, &dom_xpath_prop_handlers, sizeof(dom_xpath_prop_handlers), NULL); #endif @@ -1226,6 +1227,7 @@ zend_object_value dom_xpath_objects_new(zend_class_entry *class_type TSRMLS_DC) intern->registerPhpFunctions = 0; intern->registered_phpfunctions = NULL; intern->node_list = NULL; + intern->enable_register_node_ns = 1; ALLOC_HASHTABLE(intern->registered_phpfunctions); zend_hash_init(intern->registered_phpfunctions, 0, NULL, ZVAL_PTR_DTOR, 0); diff --git a/ext/dom/php_dom.h b/ext/dom/php_dom.h index f2bccf7b87186..d930cc633bedd 100644 --- a/ext/dom/php_dom.h +++ b/ext/dom/php_dom.h @@ -76,6 +76,7 @@ typedef struct _dom_xpath_object { int registerPhpFunctions; HashTable *registered_phpfunctions; HashTable *node_list; + zend_bool enable_register_node_ns; } dom_xpath_object; typedef struct _dom_nnodemap_object { diff --git a/ext/dom/tests/bug55700.phpt b/ext/dom/tests/bug55700.phpt new file mode 100644 index 0000000000000..19c4b4b1e0d9d --- /dev/null +++ b/ext/dom/tests/bug55700.phpt @@ -0,0 +1,34 @@ +--TEST-- +Bug #55700 (Disable automatic registration on a DOMXpath object) +--SKIPIF-- + +--FILE-- +loadXML( + ''. + ''. + '' +); +$xpath = new DOMXPath($dom); + +// disable automatic namespace registration +var_dump($xpath->enableRegisterNodeNS); +$xpath->enableRegisterNodeNS = FALSE; +var_dump($xpath->enableRegisterNodeNS); + +$context = $dom->documentElement->firstChild; +$xpath->registerNamespace('a', 'urn:b'); +var_dump( + $xpath->evaluate( + 'descendant-or-self::a:*', + $context + )->item(0)->tagName +); + +?> +--EXPECT-- +bool(true) +bool(false) +string(5) "b:bar" diff --git a/ext/dom/xpath.c b/ext/dom/xpath.c index a7540ba38dad9..7e75e45dce9dd 100644 --- a/ext/dom/xpath.c +++ b/ext/dom/xpath.c @@ -344,6 +344,25 @@ int dom_xpath_document_read(dom_object *obj, zval **retval TSRMLS_DC) } /* }}} */ +/* {{{ enableRegisterNodeNS boolean +readonly=no +*/ +int dom_xpath_enable_register_node_ns_read(dom_object *obj, zval **retval TSRMLS_DC) +{ + MAKE_STD_ZVAL(*retval); + ZVAL_BOOL(*retval, ((dom_xpath_object *)obj)->enable_register_node_ns); + + return SUCCESS; +} + +int dom_xpath_enable_register_node_ns_write(dom_object *obj, zval *newval TSRMLS_DC) +{ + ((dom_xpath_object *)obj)->enable_register_node_ns = zend_is_true(newval); + + return SUCCESS; +} +/* }}} */ + /* {{{ proto boolean dom_xpath_register_ns(string prefix, string uri); */ PHP_FUNCTION(dom_xpath_register_ns) { @@ -430,6 +449,11 @@ static void php_xpath_eval(INTERNAL_FUNCTION_PARAMETERS, int type) /* {{{ */ ctxp->node = nodep; + if (ZEND_NUM_ARGS() < 3) { + /* register_node_ns was not passed, fetch default value from the property */ + register_node_ns = intern->enable_register_node_ns; + } + if (register_node_ns) { /* Register namespaces in the node */ ns = xmlGetNsList(docp, nodep);