Index: third_party/libxslt/libxslt/templates.c |
diff --git a/third_party/libxslt/libxslt/templates.c b/third_party/libxslt/libxslt/templates.c |
index 41f1157758fd74b57c2316c51d19a3cb908caf5e..02193f7eef7e04ed71e2136b9b099ac3a6ddcb5e 100644 |
--- a/third_party/libxslt/libxslt/templates.c |
+++ b/third_party/libxslt/libxslt/templates.c |
@@ -40,7 +40,7 @@ |
* Module interfaces * |
* * |
************************************************************************/ |
- |
+ |
/** |
* xsltEvalXPathPredicate: |
* @ctxt: the XSLT transformation context |
@@ -199,7 +199,8 @@ xsltEvalTemplateString(xsltTransformContextPtr ctxt, |
xmlNodePtr oldInsert, insert = NULL; |
xmlChar *ret; |
- if ((ctxt == NULL) || (contextNode == NULL) || (inst == NULL)) |
+ if ((ctxt == NULL) || (contextNode == NULL) || (inst == NULL) || |
+ (inst->type != XML_ELEMENT_NODE)) |
return(NULL); |
if (inst->children == NULL) |
@@ -280,7 +281,17 @@ xsltAttrTemplateValueProcessNode(xsltTransformContextPtr ctxt, |
ret = xmlStrncat(ret, str, cur - str); |
str = cur; |
cur++; |
- while ((*cur != 0) && (*cur != '}')) cur++; |
+ while ((*cur != 0) && (*cur != '}')) { |
+ /* Need to check for literal (bug539741) */ |
+ if ((*cur == '\'') || (*cur == '"')) { |
+ char delim = *(cur++); |
+ while ((*cur != 0) && (*cur != delim)) |
+ cur++; |
+ if (*cur != 0) |
+ cur++; /* skip the ending delimiter */ |
+ } else |
+ cur++; |
+ } |
if (*cur == 0) { |
xsltTransformError(ctxt, NULL, inst, |
"xsltAttrTemplateValueProcessNode: unmatched '{'\n"); |
@@ -381,7 +392,8 @@ xsltEvalAttrValueTemplate(xsltTransformContextPtr ctxt, xmlNodePtr inst, |
xmlChar *ret; |
xmlChar *expr; |
- if ((ctxt == NULL) || (inst == NULL) || (name == NULL)) |
+ if ((ctxt == NULL) || (inst == NULL) || (name == NULL) || |
+ (inst->type != XML_ELEMENT_NODE)) |
return(NULL); |
expr = xsltGetNsProp(inst, name, ns); |
@@ -425,7 +437,8 @@ xsltEvalStaticAttrValueTemplate(xsltStylesheetPtr style, xmlNodePtr inst, |
const xmlChar *ret; |
xmlChar *expr; |
- if ((style == NULL) || (inst == NULL) || (name == NULL)) |
+ if ((style == NULL) || (inst == NULL) || (name == NULL) || |
+ (inst->type != XML_ELEMENT_NODE)) |
return(NULL); |
expr = xsltGetNsProp(inst, name, ns); |
@@ -455,7 +468,7 @@ xsltEvalStaticAttrValueTemplate(xsltStylesheetPtr style, xmlNodePtr inst, |
* Evaluates Attribute Value Templates and copies the attribute over to |
* the result element. |
* This does *not* process attribute sets (xsl:use-attribute-set). |
- * |
+ * |
* |
* Returns the generated attribute node. |
*/ |
@@ -466,16 +479,17 @@ xsltAttrTemplateProcess(xsltTransformContextPtr ctxt, xmlNodePtr target, |
const xmlChar *value; |
xmlAttrPtr ret; |
- if ((ctxt == NULL) || (attr == NULL) || (target == NULL)) |
+ if ((ctxt == NULL) || (attr == NULL) || (target == NULL) || |
+ (target->type != XML_ELEMENT_NODE)) |
return(NULL); |
- |
+ |
if (attr->type != XML_ATTRIBUTE_NODE) |
return(NULL); |
/* |
* Skip all XSLT attributes. |
*/ |
-#ifdef XSLT_REFACTORED |
+#ifdef XSLT_REFACTORED |
if (attr->psvi == xsltXSLTAttrMarker) |
return(NULL); |
#else |
@@ -512,7 +526,7 @@ xsltAttrTemplateProcess(xsltTransformContextPtr ctxt, xmlNodePtr target, |
} |
ret = ret->next; |
} |
- if (ret != NULL) { |
+ if (ret != NULL) { |
/* free the existing value */ |
xmlFreeNodeList(ret->children); |
ret->children = ret->last = NULL; |
@@ -531,7 +545,7 @@ xsltAttrTemplateProcess(xsltTransformContextPtr ctxt, xmlNodePtr target, |
xsltGetNamespace(ctxt, attr->parent, attr->ns, target), |
attr->name, NULL); |
else |
- ret = xmlNewNsProp(target, NULL, attr->name, NULL); |
+ ret = xmlNewNsProp(target, NULL, attr->name, NULL); |
} |
/* |
* Set the value. |
@@ -583,11 +597,11 @@ xsltAttrTemplateProcess(xsltTransformContextPtr ctxt, xmlNodePtr target, |
} else { |
if (attr->ns) { |
xsltTransformError(ctxt, NULL, attr->parent, |
- "Internal error: Failed to create attribute '{%s}%s'.\n", |
+ "Internal error: Failed to create attribute '{%s}%s'.\n", |
attr->ns->href, attr->name); |
} else { |
xsltTransformError(ctxt, NULL, attr->parent, |
- "Internal error: Failed to create attribute '%s'.\n", |
+ "Internal error: Failed to create attribute '%s'.\n", |
attr->name); |
} |
} |
@@ -615,7 +629,7 @@ xsltAttrTemplateProcess(xsltTransformContextPtr ctxt, xmlNodePtr target, |
* attributes will be disattached.) |
*/ |
xmlAttrPtr |
-xsltAttrListTemplateProcess(xsltTransformContextPtr ctxt, |
+xsltAttrListTemplateProcess(xsltTransformContextPtr ctxt, |
xmlNodePtr target, xmlAttrPtr attrs) |
{ |
xmlAttrPtr attr, copy, last; |
@@ -624,11 +638,12 @@ xsltAttrListTemplateProcess(xsltTransformContextPtr ctxt, |
const xmlChar *value; |
xmlChar *valueAVT; |
- if ((ctxt == NULL) || (target == NULL) || (attrs == NULL)) |
+ if ((ctxt == NULL) || (target == NULL) || (attrs == NULL) || |
+ (target->type != XML_ELEMENT_NODE)) |
return(NULL); |
oldInsert = ctxt->insert; |
- ctxt->insert = target; |
+ ctxt->insert = target; |
/* |
* Instantiate LRE-attributes. |
@@ -821,7 +836,7 @@ xmlNodePtr * |
xsltTemplateProcess(xsltTransformContextPtr ctxt ATTRIBUTE_UNUSED, xmlNodePtr node) { |
if (node == NULL) |
return(NULL); |
- |
+ |
return(0); |
} |