From 8d85732a7dbc279c33c16b56a337290c45439b56 Mon Sep 17 00:00:00 2001 From: ehofman Date: Mon, 20 Apr 2009 19:56:09 +0000 Subject: [PATCH] fix a case where a single-element root path (e.g. /printer) would not pass xmlNodeGetPath --- utils/xmlgrep/ChangeLog | 2 ++ utils/xmlgrep/xml.c | 42 ++++++++++++++++++----------------------- 2 files changed, 20 insertions(+), 24 deletions(-) diff --git a/utils/xmlgrep/ChangeLog b/utils/xmlgrep/ChangeLog index aa89f090d..f935845aa 100644 --- a/utils/xmlgrep/ChangeLog +++ b/utils/xmlgrep/ChangeLog @@ -1,4 +1,6 @@ 20-04-2008 + * fix a case where a single-element root path (e.g. "/printer") would not + pass xmlNodeGetPath * fix a problem where attributes or elements starting with the same letter sequence could give a false negative result * Add a 'clear' attribute to the xmlErrorGet functions that indicates whether diff --git a/utils/xmlgrep/xml.c b/utils/xmlgrep/xml.c index 9660242a0..05e220f48 100644 --- a/utils/xmlgrep/xml.c +++ b/utils/xmlgrep/xml.c @@ -44,9 +44,9 @@ typedef struct #ifndef NDEBUG # include #endif -#include -#include /* free, malloc */ +#include /* free, malloc */ #include +#include #include #include #include @@ -306,13 +306,10 @@ xmlNodeCopyName(const void *id, char *buf, size_t buflen) assert(buf != 0); assert(buflen > 0); - slen = buflen-1; - if (slen > xid->name_len) - { - slen = xid->name_len; - } - else + slen = xid->name_len; + if (slen >= buflen) { + slen = buflen-1; xmlErrorSet(xid, 0, XML_TRUNCATE_RESULT); } memcpy(buf, xid->name, slen); @@ -1292,13 +1289,13 @@ __xmlNodeGetPath(const char *start, size_t *len, char **name, size_t *plen) assert(start != 0); assert(len != 0); + assert(*len != 0); assert(name != 0); assert(*name != 0); assert(plen != 0); assert(*plen != 0); - if ((*len == 0) || (*plen == 0) || (*plen > *len)) - return 0; + if (*plen > *len) return 0; node = *name; if (*node == '/') node++; @@ -1314,20 +1311,17 @@ __xmlNodeGetPath(const char *start, size_t *len, char **name, size_t *plen) if (!path) plen = slen; else plen = path++ - node; - if (path) + num = 0; + ret = __xmlNodeGet(start, len, &node, &plen, &num); + if (ret && path) { - num = 0; - ret = __xmlNodeGet(start, len, &node, &plen, &num); - if (ret) - { - plen = slen - (path - *name); - ret = __xmlNodeGetPath(ret, len, &path, &plen); - *name = path; - } - else if (plen == 0) - { - *name = node; - } + plen = slen - (path - *name); + ret = __xmlNodeGetPath(ret, len, &path, &plen); + *name = path; + } + else if (plen == 0) + { + *name = node; } } @@ -1355,7 +1349,7 @@ __xmlNodeGet(const char *start, size_t *len, char **name, size_t *rlen, size_t * if (*rlen > *len) { *rlen = 0; - *name = start; + *name = (char *)start; *len = XML_UNEXPECTED_EOF; return 0; }