diff options
Diffstat (limited to 'chromium/third_party/libxslt/src/libxslt/keys.c')
-rw-r--r-- | chromium/third_party/libxslt/src/libxslt/keys.c | 17 |
1 files changed, 11 insertions, 6 deletions
diff --git a/chromium/third_party/libxslt/src/libxslt/keys.c b/chromium/third_party/libxslt/src/libxslt/keys.c index 2881056e5db..ecef5382638 100644 --- a/chromium/third_party/libxslt/src/libxslt/keys.c +++ b/chromium/third_party/libxslt/src/libxslt/keys.c @@ -241,6 +241,8 @@ skipString(const xmlChar *cur, int end) { */ static int skipPredicate(const xmlChar *cur, int end) { + int level = 0; + if ((cur == NULL) || (end < 0)) return(-1); if (cur[end] != '[') return(end); end++; @@ -251,12 +253,12 @@ skipPredicate(const xmlChar *cur, int end) { return(-1); continue; } else if (cur[end] == '[') { - end = skipPredicate(cur, end); - if (end <= 0) - return(-1); - continue; - } else if (cur[end] == ']') - return(end + 1); + level += 1; + } else if (cur[end] == ']') { + if (level == 0) + return(end + 1); + level -= 1; + } end++; } return(-1); @@ -629,6 +631,7 @@ xsltInitCtxtKey(xsltTransformContextPtr ctxt, xsltDocumentPtr idoc, xmlNodePtr oldContextNode; xsltDocumentPtr oldDocInfo; int oldXPPos, oldXPSize; + xmlNodePtr oldXPNode; xmlDocPtr oldXPDoc; int oldXPNsNr; xmlNsPtr *oldXPNamespaces; @@ -667,6 +670,7 @@ fprintf(stderr, "xsltInitCtxtKey %s : %d\n", keyDef->name, ctxt->keyInitLevel); oldDocInfo = ctxt->document; oldContextNode = ctxt->node; + oldXPNode = xpctxt->node; oldXPDoc = xpctxt->doc; oldXPPos = xpctxt->proximityPosition; oldXPSize = xpctxt->contextSize; @@ -865,6 +869,7 @@ error: /* * Restore context state. */ + xpctxt->node = oldXPNode; xpctxt->doc = oldXPDoc; xpctxt->nsNr = oldXPNsNr; xpctxt->namespaces = oldXPNamespaces; |