From 9e36b867568d3cb5ac1d620a08a982642ddeae5b Mon Sep 17 00:00:00 2001
From: ehofman <ehofman>
Date: Tue, 28 Apr 2009 13:59:26 +0000
Subject: [PATCH]   * changes to the code to allow walking the xml-tree using
 "*" as a node name

---
 utils/xmlgrep/ChangeLog |  4 +++-
 utils/xmlgrep/xml.c     | 24 ++++++++----------------
 2 files changed, 11 insertions(+), 17 deletions(-)

diff --git a/utils/xmlgrep/ChangeLog b/utils/xmlgrep/ChangeLog
index 47dd69e4f..d7b5b37f6 100644
--- a/utils/xmlgrep/ChangeLog
+++ b/utils/xmlgrep/ChangeLog
@@ -1,9 +1,11 @@
+28-04-2009
+  * changes to the code to allow walking the xml-tree using "*" as a node name
+
 27-04-2009
   * add xmlInitBuffer() for processing of a preallocated buffer
   * add xmlErrorGetColumnNo to get the column number of the syntax error
   * pass an error at a higher level to lower levels
   * detect a number of extra syntax errors
-  * fix a buffer overflow
 
 26-04-2009
   * add support for comments inside xml-tags, e.g.: <test><!-- --></test>
diff --git a/utils/xmlgrep/xml.c b/utils/xmlgrep/xml.c
index 7315386c1..d83295dd8 100644
--- a/utils/xmlgrep/xml.c
+++ b/utils/xmlgrep/xml.c
@@ -1396,9 +1396,11 @@ __xmlNodeGetPath(const char *start, size_t *len, char **name, size_t *plen)
 char *
 __xmlNodeGet(const char *start, size_t *len, char **name, size_t *rlen, size_t *nodenum)
 {
-    char *element, *open_element, *start_tag=0;
+    char *open_element = *name;
+    char *element, *start_tag=0;
     char *new, *cur, *ne, *ret = 0;
     size_t restlen, elementlen;
+    size_t open_len = *rlen;
     size_t return_len = 0;
     int found, num;
 
@@ -1474,7 +1476,6 @@ __xmlNodeGet(const char *start, size_t *len, char **name, size_t *rlen, size_t *
         /*
          * get element name and a pointer to after the opening tag
          */
-        open_element = cur;
         element = *name;
         elementlen = *rlen;
         len_remaining = restlen;
@@ -1485,8 +1486,8 @@ __xmlNodeGet(const char *start, size_t *len, char **name, size_t *rlen, size_t *
             if (found == num)
             {
                 ret = new;
+                open_len = elementlen;
                 start_tag = element;
-                *rlen = elementlen;
             }
             else start_tag = 0;
         }
@@ -1510,7 +1511,7 @@ __xmlNodeGet(const char *start, size_t *len, char **name, size_t *rlen, size_t *
             {
                 if (found == num)
                 {
-                    *name = start_tag;
+                    open_element = start_tag;
                     *len = 0;
                 }
                 found++;
@@ -1631,7 +1632,7 @@ __xmlNodeGet(const char *start, size_t *len, char **name, size_t *rlen, size_t *
                     if (start_tag)
                     {
                         *len = new-ret-1;
-                        *name = start_tag;
+                        open_element = start_tag;
                     }
                     else /* report error */
                     {
@@ -1643,16 +1644,6 @@ __xmlNodeGet(const char *start, size_t *len, char **name, size_t *rlen, size_t *
                 }
                 found++;
             }
-#ifndef XML_NONVALIDATING
-            /* strcmp is a heavy operation when not required */
-            else if (strncmp(open_element, new+1, elementlen))
-            {
-                *rlen = 0;
-                *name = new+1;
-                *len = XML_ELEMENT_NO_CLOSING_TAG;
-                return 0;
-            }
-#endif
 
             new = memchr(cur, '>', restlen);
             if (!new)
@@ -1684,7 +1675,8 @@ __xmlNodeGet(const char *start, size_t *len, char **name, size_t *rlen, size_t *
     }
     else
     {
-        *rlen = return_len;
+        *rlen = open_len;
+        *name = open_element;
         *nodenum = found;
     }