Index: third_party/libxml/src/xpointer.c |
diff --git a/third_party/libxml/src/xpointer.c b/third_party/libxml/src/xpointer.c |
index ae5dd08685db176577541e839ed93e54d5a00951..4b4ac2ee5c9b755e8c99419aca2564d9da27cbf4 100644 |
--- a/third_party/libxml/src/xpointer.c |
+++ b/third_party/libxml/src/xpointer.c |
@@ -7,7 +7,7 @@ |
* |
* Added support for the element() scheme described in: |
* W3C Proposed Recommendation 13 November 2002 |
- * http://www.w3.org/TR/2002/PR-xptr-element-20021113/ |
+ * http://www.w3.org/TR/2002/PR-xptr-element-20021113/ |
* |
* See Copyright for the status of this software. |
* |
@@ -47,19 +47,19 @@ |
#endif |
#endif |
-#define TODO \ |
+#define TODO \ |
xmlGenericError(xmlGenericErrorContext, \ |
"Unimplemented block at %s:%d\n", \ |
__FILE__, __LINE__); |
-#define STRANGE \ |
+#define STRANGE \ |
xmlGenericError(xmlGenericErrorContext, \ |
"Internal error at %s:%d\n", \ |
__FILE__, __LINE__); |
/************************************************************************ |
* * |
- * Some factorized error routines * |
+ * Some factorized error routines * |
* * |
************************************************************************/ |
@@ -134,7 +134,7 @@ xmlNodePtr xmlXPtrAdvanceNode(xmlNodePtr cur, int *level); |
static int |
xmlXPtrGetArity(xmlNodePtr cur) { |
int i; |
- if (cur == NULL) |
+ if ((cur == NULL) || (cur->type == XML_NAMESPACE_DECL)) |
return(-1); |
cur = cur->children; |
for (i = 0;cur != NULL;cur = cur->next) { |
@@ -157,7 +157,7 @@ xmlXPtrGetArity(xmlNodePtr cur) { |
static int |
xmlXPtrGetIndex(xmlNodePtr cur) { |
int i; |
- if (cur == NULL) |
+ if ((cur == NULL) || (cur->type == XML_NAMESPACE_DECL)) |
return(-1); |
for (i = 1;cur != NULL;cur = cur->prev) { |
if ((cur->type == XML_ELEMENT_NODE) || |
@@ -179,11 +179,11 @@ xmlXPtrGetIndex(xmlNodePtr cur) { |
static xmlNodePtr |
xmlXPtrGetNthChild(xmlNodePtr cur, int no) { |
int i; |
- if (cur == NULL) |
+ if ((cur == NULL) || (cur->type == XML_NAMESPACE_DECL)) |
return(cur); |
cur = cur->children; |
for (i = 0;i <= no;cur = cur->next) { |
- if (cur == NULL) |
+ if (cur == NULL) |
return(cur); |
if ((cur->type == XML_ELEMENT_NODE) || |
(cur->type == XML_DOCUMENT_NODE) || |
@@ -553,7 +553,7 @@ xmlXPtrNewRangeNodeObject(xmlNodePtr start, xmlXPathObjectPtr end) { |
break; |
case XPATH_NODESET: |
/* |
- * Empty set ... |
+ * Empty set ... |
*/ |
if (end->nodesetval->nodeNr <= 0) |
return(NULL); |
@@ -731,7 +731,7 @@ xmlXPtrLocationSetDel(xmlLocationSetPtr cur, xmlXPathObjectPtr val) { |
if (i >= cur->locNr) { |
#ifdef DEBUG |
- xmlGenericError(xmlGenericErrorContext, |
+ xmlGenericError(xmlGenericErrorContext, |
"xmlXPtrLocationSetDel: Range wasn't found in RangeList\n"); |
#endif |
return; |
@@ -903,7 +903,7 @@ static void xmlXPtrEvalChildSeq(xmlXPathParserContextPtr ctxt, xmlChar *name); |
#define NXT(val) ctxt->cur[(val)] |
#define CUR_PTR ctxt->cur |
-#define SKIP_BLANKS \ |
+#define SKIP_BLANKS \ |
while (IS_BLANK_CH(*(ctxt->cur))) NEXT |
#define CURRENT (*ctxt->cur) |
@@ -945,7 +945,7 @@ xmlXPtrGetChildNo(xmlXPathParserContextPtr ctxt, int indx) { |
* xmlXPtrEvalXPtrPart: |
* @ctxt: the XPointer Parser context |
* @name: the preparsed Scheme for the XPtrPart |
- * |
+ * |
* XPtrPart ::= 'xpointer' '(' XPtrExpr ')' |
* | Scheme '(' SchemeSpecificExpr ')' |
* |
@@ -953,7 +953,7 @@ xmlXPtrGetChildNo(xmlXPathParserContextPtr ctxt, int indx) { |
* |
* SchemeSpecificExpr ::= StringWithBalancedParens |
* |
- * StringWithBalancedParens ::= |
+ * StringWithBalancedParens ::= |
* [^()]* ('(' StringWithBalancedParens ')' [^()]*)* |
* [VC: Parenthesis escaping] |
* |
@@ -971,7 +971,7 @@ xmlXPtrGetChildNo(xmlXPathParserContextPtr ctxt, int indx) { |
* |
* Parse and evaluate an XPtrPart. Basically it generates the unescaped |
* string and if the scheme is 'xpointer' it will call the XPath interpreter. |
- * |
+ * |
* TODO: there is no new scheme registration mechanism |
*/ |
@@ -1010,11 +1010,11 @@ xmlXPtrEvalXPtrPart(xmlXPathParserContextPtr ctxt, xmlChar *name) { |
} else if (CUR == '(') { |
level++; |
} else if (CUR == '^') { |
- if ((NXT(1) == ')') || (NXT(1) == '(') || (NXT(1) == '^')) { |
- NEXT; |
- } |
+ if ((NXT(1) == ')') || (NXT(1) == '(') || (NXT(1) == '^')) { |
+ NEXT; |
+ } |
} |
- *cur++ = CUR; |
+ *cur++ = CUR; |
NEXT; |
} |
*cur = 0; |
@@ -1097,7 +1097,7 @@ xmlXPtrEvalXPtrPart(xmlXPathParserContextPtr ctxt, xmlChar *name) { |
xmlFree(name); |
XP_ERROR(XPATH_MEMORY_ERROR); |
} |
- |
+ |
xmlXPathRegisterNs(ctxt->context, prefix, URI); |
CUR_PTR = left; |
xmlFree(URI); |
@@ -1229,7 +1229,7 @@ xmlXPtrEvalChildSeq(xmlXPathParserContextPtr ctxt, xmlChar *name) { |
while (CUR == '/') { |
int child = 0; |
NEXT; |
- |
+ |
while ((CUR >= '0') && (CUR <= '9')) { |
child = child * 10 + (CUR - '0'); |
NEXT; |
@@ -1253,7 +1253,7 @@ static void |
xmlXPtrEvalXPointer(xmlXPathParserContextPtr ctxt) { |
if (ctxt->valueTab == NULL) { |
/* Allocate the value stack */ |
- ctxt->valueTab = (xmlXPathObjectPtr *) |
+ ctxt->valueTab = (xmlXPathObjectPtr *) |
xmlMalloc(10 * sizeof(xmlXPathObjectPtr)); |
if (ctxt->valueTab == NULL) { |
xmlXPtrErrMemory("allocating evaluation context"); |
@@ -1262,6 +1262,7 @@ xmlXPtrEvalXPointer(xmlXPathParserContextPtr ctxt) { |
ctxt->valueNr = 0; |
ctxt->valueMax = 10; |
ctxt->value = NULL; |
+ ctxt->valueFrame = 0; |
} |
SKIP_BLANKS; |
if (CUR == '/') { |
@@ -1374,6 +1375,8 @@ xmlXPtrEval(const xmlChar *str, xmlXPathContextPtr ctx) { |
return(NULL); |
ctxt = xmlXPathNewParserContext(str, ctx); |
+ if (ctxt == NULL) |
+ return(NULL); |
ctxt->xptr = 1; |
xmlXPtrEvalXPointer(ctxt); |
@@ -1395,13 +1398,13 @@ xmlXPtrEval(const xmlChar *str, xmlXPathContextPtr ctx) { |
/* |
* Evaluation may push a root nodeset which is unused |
*/ |
- xmlNodeSetPtr set; |
+ xmlNodeSetPtr set; |
set = tmp->nodesetval; |
if ((set->nodeNr != 1) || |
(set->nodeTab[0] != (xmlNodePtr) ctx->doc)) |
stack++; |
} else |
- stack++; |
+ stack++; |
} |
xmlXPathFreeObject(tmp); |
} |
@@ -1415,7 +1418,7 @@ xmlXPtrEval(const xmlChar *str, xmlXPathContextPtr ctx) { |
xmlXPathFreeObject(res); |
res = NULL; |
} |
- |
+ |
xmlXPathFreeParserContext(ctxt); |
return(res); |
} |
@@ -1443,11 +1446,13 @@ xmlXPtrBuildRangeNodeList(xmlXPathObjectPtr range) { |
return(NULL); |
start = (xmlNodePtr) range->user; |
- if (start == NULL) |
+ if ((start == NULL) || (start->type == XML_NAMESPACE_DECL)) |
return(NULL); |
end = range->user2; |
if (end == NULL) |
return(xmlCopyNode(start, 1)); |
+ if (end->type == XML_NAMESPACE_DECL) |
+ return(NULL); |
cur = start; |
index1 = range->index; |
@@ -1477,7 +1482,7 @@ xmlXPtrBuildRangeNodeList(xmlXPathObjectPtr range) { |
/* prune and return full set */ |
if (last != NULL) |
xmlAddNextSibling(last, tmp); |
- else |
+ else |
xmlAddChild(parent, tmp); |
return(list); |
} else { |
@@ -1731,7 +1736,7 @@ xmlXPtrNbLocChildren(xmlNodePtr node) { |
* @ctxt: the XPointer Parser context |
* @nargs: the number of args |
* |
- * Function implementing here() operation |
+ * Function implementing here() operation |
* as described in 5.4.3 |
*/ |
static void |
@@ -1740,7 +1745,7 @@ xmlXPtrHereFunction(xmlXPathParserContextPtr ctxt, int nargs) { |
if (ctxt->context->here == NULL) |
XP_ERROR(XPTR_SYNTAX_ERROR); |
- |
+ |
valuePush(ctxt, xmlXPtrNewLocationSetNodes(ctxt->context->here, NULL)); |
} |
@@ -1749,7 +1754,7 @@ xmlXPtrHereFunction(xmlXPathParserContextPtr ctxt, int nargs) { |
* @ctxt: the XPointer Parser context |
* @nargs: the number of args |
* |
- * Function implementing origin() operation |
+ * Function implementing origin() operation |
* as described in 5.4.3 |
*/ |
static void |
@@ -1758,7 +1763,7 @@ xmlXPtrOriginFunction(xmlXPathParserContextPtr ctxt, int nargs) { |
if (ctxt->context->origin == NULL) |
XP_ERROR(XPTR_SYNTAX_ERROR); |
- |
+ |
valuePush(ctxt, xmlXPtrNewLocationSetNodes(ctxt->context->origin, NULL)); |
} |
@@ -1767,7 +1772,7 @@ xmlXPtrOriginFunction(xmlXPathParserContextPtr ctxt, int nargs) { |
* @ctxt: the XPointer Parser context |
* @nargs: the number of args |
* |
- * Function implementing start-point() operation |
+ * Function implementing start-point() operation |
* as described in 5.4.3 |
* ---------------- |
* location-set start-point(location-set) |
@@ -1804,6 +1809,8 @@ xmlXPtrStartPointFunction(xmlXPathParserContextPtr ctxt, int nargs) { |
*/ |
tmp = xmlXPtrNewLocationSetNodeSet(obj->nodesetval); |
xmlXPathFreeObject(obj); |
+ if (tmp == NULL) |
+ XP_ERROR(XPATH_MEMORY_ERROR) |
obj = tmp; |
} |
@@ -1859,7 +1866,7 @@ xmlXPtrStartPointFunction(xmlXPathParserContextPtr ctxt, int nargs) { |
* @ctxt: the XPointer Parser context |
* @nargs: the number of args |
* |
- * Function implementing end-point() operation |
+ * Function implementing end-point() operation |
* as described in 5.4.3 |
* ---------------------------- |
* location-set end-point(location-set) |
@@ -1898,10 +1905,16 @@ xmlXPtrEndPointFunction(xmlXPathParserContextPtr ctxt, int nargs) { |
*/ |
tmp = xmlXPtrNewLocationSetNodeSet(obj->nodesetval); |
xmlXPathFreeObject(obj); |
+ if (tmp == NULL) |
+ XP_ERROR(XPATH_MEMORY_ERROR) |
obj = tmp; |
} |
newset = xmlXPtrLocationSetCreate(NULL); |
+ if (newset == NULL) { |
+ xmlXPathFreeObject(obj); |
+ XP_ERROR(XPATH_MEMORY_ERROR); |
+ } |
oldset = (xmlLocationSetPtr) obj->user; |
if (oldset != NULL) { |
int i; |
@@ -1995,7 +2008,7 @@ xmlXPtrCoveringRange(xmlXPathParserContextPtr ctxt, xmlXPathObjectPtr loc) { |
case XML_NOTATION_NODE: |
case XML_HTML_DOCUMENT_NODE: { |
int indx = xmlXPtrGetIndex(node); |
- |
+ |
node = node->parent; |
return(xmlXPtrNewRange(node, indx - 1, |
node, indx + 1)); |
@@ -2046,6 +2059,8 @@ xmlXPtrRangeFunction(xmlXPathParserContextPtr ctxt, int nargs) { |
*/ |
tmp = xmlXPtrNewLocationSetNodeSet(set->nodesetval); |
xmlXPathFreeObject(set); |
+ if (tmp == NULL) |
+ XP_ERROR(XPATH_MEMORY_ERROR) |
set = tmp; |
} |
oldset = (xmlLocationSetPtr) set->user; |
@@ -2054,6 +2069,10 @@ xmlXPtrRangeFunction(xmlXPathParserContextPtr ctxt, int nargs) { |
* The loop is to compute the covering range for each item and add it |
*/ |
newset = xmlXPtrLocationSetCreate(NULL); |
+ if (newset == NULL) { |
+ xmlXPathFreeObject(set); |
+ XP_ERROR(XPATH_MEMORY_ERROR); |
+ } |
for (i = 0;i < oldset->locNr;i++) { |
xmlXPtrLocationSetAdd(newset, |
xmlXPtrCoveringRange(ctxt, oldset->locTab[i])); |
@@ -2192,6 +2211,8 @@ xmlXPtrRangeInsideFunction(xmlXPathParserContextPtr ctxt, int nargs) { |
*/ |
tmp = xmlXPtrNewLocationSetNodeSet(set->nodesetval); |
xmlXPathFreeObject(set); |
+ if (tmp == NULL) |
+ XP_ERROR(XPATH_MEMORY_ERROR) |
set = tmp; |
} |
oldset = (xmlLocationSetPtr) set->user; |
@@ -2200,6 +2221,10 @@ xmlXPtrRangeInsideFunction(xmlXPathParserContextPtr ctxt, int nargs) { |
* The loop is to compute the covering range for each item and add it |
*/ |
newset = xmlXPtrLocationSetCreate(NULL); |
+ if (newset == NULL) { |
+ xmlXPathFreeObject(set); |
+ XP_ERROR(XPATH_MEMORY_ERROR); |
+ } |
for (i = 0;i < oldset->locNr;i++) { |
xmlXPtrLocationSetAdd(newset, |
xmlXPtrInsideRange(ctxt, oldset->locTab[i])); |
@@ -2242,7 +2267,7 @@ xmlXPtrRangeToFunction(xmlXPathParserContextPtr ctxt, int nargs) { |
cur = ctxt->cur; |
newset = xmlXPtrLocationSetCreate(NULL); |
- |
+ |
for (i = 0; i < oldset->nodeNr; i++) { |
ctxt->cur = cur; |
@@ -2276,7 +2301,7 @@ xmlXPtrRangeToFunction(xmlXPathParserContextPtr ctxt, int nargs) { |
res = valuePop(ctxt); |
xmlXPathFreeObject(res); |
} |
- |
+ |
ctxt->context->node = NULL; |
} |
@@ -2296,14 +2321,14 @@ xmlXPtrRangeToFunction(xmlXPathParserContextPtr ctxt, int nargs) { |
* @level: incremented/decremented to show level in tree |
* |
* Advance to the next element or text node in document order |
- * TODO: add a stack for entering/exiting entities |
+ * TODO: add a stack for entering/exiting entities |
* |
* Returns -1 in case of failure, 0 otherwise |
*/ |
xmlNodePtr |
xmlXPtrAdvanceNode(xmlNodePtr cur, int *level) { |
next: |
- if (cur == NULL) |
+ if ((cur == NULL) || (cur->type == XML_NAMESPACE_DECL)) |
return(NULL); |
if (cur->children != NULL) { |
cur = cur->children ; |
@@ -2361,7 +2386,7 @@ xmlXPtrAdvanceChar(xmlNodePtr *node, int *indx, int bytes) { |
if ((node == NULL) || (indx == NULL)) |
return(-1); |
cur = *node; |
- if (cur == NULL) |
+ if ((cur == NULL) || (cur->type == XML_NAMESPACE_DECL)) |
return(-1); |
pos = *indx; |
@@ -2399,7 +2424,7 @@ xmlXPtrAdvanceChar(xmlNodePtr *node, int *indx, int bytes) { |
return(0); |
} |
/* |
- * We should have a text (or cdata) node ... |
+ * We should have a text (or cdata) node ... |
*/ |
len = 0; |
if ((cur->type != XML_ELEMENT_NODE) && |
@@ -2452,13 +2477,12 @@ xmlXPtrMatchString(const xmlChar *string, xmlNodePtr start, int startindex, |
if (string == NULL) |
return(-1); |
- if (start == NULL) |
+ if ((start == NULL) || (start->type == XML_NAMESPACE_DECL)) |
return(-1); |
- if ((end == NULL) || (endindex == NULL)) |
+ if ((end == NULL) || (*end == NULL) || |
+ ((*end)->type == XML_NAMESPACE_DECL) || (endindex == NULL)) |
return(-1); |
cur = start; |
- if (cur == NULL) |
- return(-1); |
pos = startindex - 1; |
stringlen = xmlStrlen(string); |
@@ -2537,13 +2561,12 @@ xmlXPtrSearchString(const xmlChar *string, xmlNodePtr *start, int *startindex, |
if (string == NULL) |
return(-1); |
- if ((start == NULL) || (startindex == NULL)) |
+ if ((start == NULL) || (*start == NULL) || |
+ ((*start)->type == XML_NAMESPACE_DECL) || (startindex == NULL)) |
return(-1); |
if ((end == NULL) || (endindex == NULL)) |
return(-1); |
cur = *start; |
- if (cur == NULL) |
- return(-1); |
pos = *startindex - 1; |
first = string[0]; |
@@ -2576,7 +2599,7 @@ xmlXPtrSearchString(const xmlChar *string, xmlNodePtr *start, int *startindex, |
/* |
* An empty string is considered to match before each |
* character of the string-value and after the final |
- * character. |
+ * character. |
*/ |
#ifdef DEBUG_RANGES |
xmlGenericError(xmlGenericErrorContext, |
@@ -2617,14 +2640,12 @@ xmlXPtrGetLastChar(xmlNodePtr *node, int *indx) { |
xmlNodePtr cur; |
int pos, len = 0; |
- if ((node == NULL) || (indx == NULL)) |
+ if ((node == NULL) || (*node == NULL) || |
+ ((*node)->type == XML_NAMESPACE_DECL) || (indx == NULL)) |
return(-1); |
cur = *node; |
pos = *indx; |
- if (cur == NULL) |
- return(-1); |
- |
if ((cur->type == XML_ELEMENT_NODE) || |
(cur->type == XML_DOCUMENT_NODE) || |
(cur->type == XML_HTML_DOCUMENT_NODE)) { |
@@ -2728,7 +2749,7 @@ xmlXPtrGetEndPoint(xmlXPathObjectPtr obj, xmlNodePtr *node, int *indx) { |
* @nargs: the number of args |
* |
* Function implementing the string-range() function |
- * range as described in 5.4.2 |
+ * range as described in 5.4.2 |
* |
* ------------------------------ |
* [Definition: For each location in the location-set argument, |
@@ -2797,6 +2818,10 @@ xmlXPtrStringRangeFunction(xmlXPathParserContextPtr ctxt, int nargs) { |
set = valuePop(ctxt); |
newset = xmlXPtrLocationSetCreate(NULL); |
+ if (newset == NULL) { |
+ xmlXPathFreeObject(set); |
+ XP_ERROR(XPATH_MEMORY_ERROR); |
+ } |
if (set->nodesetval == NULL) { |
goto error; |
} |
@@ -2808,6 +2833,8 @@ xmlXPtrStringRangeFunction(xmlXPathParserContextPtr ctxt, int nargs) { |
*/ |
tmp = xmlXPtrNewLocationSetNodeSet(set->nodesetval); |
xmlXPathFreeObject(set); |
+ if (tmp == NULL) |
+ XP_ERROR(XPATH_MEMORY_ERROR) |
set = tmp; |
} |
oldset = (xmlLocationSetPtr) set->user; |
@@ -2892,7 +2919,7 @@ error: |
* @ctxt: the XPointer Parser context |
* |
* [8] Predicate ::= '[' PredicateExpr ']' |
- * [9] PredicateExpr ::= Expr |
+ * [9] PredicateExpr ::= Expr |
* |
* Evaluate a predicate as in xmlXPathEvalPredicate() but for |
* a Location Set instead of a node set |
@@ -2941,7 +2968,7 @@ xmlXPtrEvalRangePredicate(xmlXPathParserContextPtr ctxt) { |
*/ |
cur = ctxt->cur; |
newset = xmlXPtrLocationSetCreate(NULL); |
- |
+ |
for (i = 0; i < oldset->locNr; i++) { |
ctxt->cur = cur; |
@@ -2977,7 +3004,7 @@ xmlXPtrEvalRangePredicate(xmlXPathParserContextPtr ctxt) { |
res = valuePop(ctxt); |
xmlXPathFreeObject(res); |
} |
- |
+ |
ctxt->context->node = NULL; |
} |