From bcf9687606b84ba3c045efcd53db4aad19f8e36f Mon Sep 17 00:00:00 2001
From: ehofman <ehofman>
Date: Thu, 30 Apr 2009 13:56:50 +0000
Subject: [PATCH] Fix an off by one problem.

---
 utils/xmlgrep/ChangeLog |  3 +++
 utils/xmlgrep/xml.c     | 15 ++++++++-------
 2 files changed, 11 insertions(+), 7 deletions(-)

diff --git a/utils/xmlgrep/ChangeLog b/utils/xmlgrep/ChangeLog
index be6926431..81cd7801d 100644
--- a/utils/xmlgrep/ChangeLog
+++ b/utils/xmlgrep/ChangeLog
@@ -1,3 +1,6 @@
+30-04-2009
+  * Fix an off by one problem.
+
 28-04-2009
   * changes to the code to allow walking the xml-tree using "*" as a node name
   * add printxml, an example utility that walks an xml-tree and prints it
diff --git a/utils/xmlgrep/xml.c b/utils/xmlgrep/xml.c
index 8ec3e0439..fa379d748 100644
--- a/utils/xmlgrep/xml.c
+++ b/utils/xmlgrep/xml.c
@@ -1564,11 +1564,10 @@ __xmlNodeGet(const char *start, size_t *len, char **name, size_t *rlen, size_t *
             restlen -= new-cur;
             cur = new;
         }
-
         if (*cur != '/')			/* cascading tag found */
         {
             char *node = "*";
-            size_t slen = restlen+1;
+            size_t slen = restlen+1; /* due to cur-1 below*/
             size_t nlen = 1;
             size_t pos = -1;
 
@@ -1593,15 +1592,17 @@ __xmlNodeGet(const char *start, size_t *len, char **name, size_t *rlen, size_t *
                     *len = XML_UNEXPECTED_EOF;
                     return 0;
                 }
-                else new = cur + slen;
-            }
 
-            restlen -= slen;
-            cur = new;
+                slen--;
+                new = cur + slen;
+                restlen -= slen;
+            }
+            else restlen -= slen;
 
             /* 
              * look for the closing tag of the cascading block
              */
+            cur = new;
             new = memchr(cur, '<', restlen);
             if (!new)
             {
@@ -1664,7 +1665,7 @@ __xmlNodeGet(const char *start, size_t *len, char **name, size_t *rlen, size_t *
             *len = XML_ELEMENT_NO_CLOSING_TAG;
             return 0;
         }
-    }
+    } /* while */
 
     if (found == 0)
     {