Index: third_party/libxslt/libxslt/attributes.c |
diff --git a/third_party/libxslt/libxslt/attributes.c b/third_party/libxslt/libxslt/attributes.c |
index ce47df775c628cb7da4be6c38f8c6a37570c4833..2fa86e3c9632a396c2bc04171dc341c96921da59 100644 |
--- a/third_party/libxslt/libxslt/attributes.c |
+++ b/third_party/libxslt/libxslt/attributes.c |
@@ -140,7 +140,7 @@ xsltFreeAttrElem(xsltAttrElemPtr attr) { |
static void |
xsltFreeAttrElemList(xsltAttrElemPtr list) { |
xsltAttrElemPtr next; |
- |
+ |
while (list != NULL) { |
next = list->next; |
xsltFreeAttrElem(list); |
@@ -171,7 +171,7 @@ xsltAddAttrElemList(xsltAttrElemPtr list, xmlNodePtr attr) { |
if (list == NULL) |
return(xsltNewAttrElem(attr)); |
cur = list; |
- while (cur != NULL) { |
+ while (cur != NULL) { |
next = cur->next; |
if (cur->attr == attr) |
return(cur); |
@@ -293,7 +293,7 @@ xsltParseStylesheetAttributeSet(xsltStylesheetPtr style, xmlNodePtr cur) { |
xmlNodePtr child; |
xsltAttrElemPtr attrItems; |
- if ((cur == NULL) || (style == NULL)) |
+ if ((cur == NULL) || (style == NULL) || (cur->type != XML_ELEMENT_NODE)) |
return; |
value = xmlGetNsProp(cur, (const xmlChar *)"name", NULL); |
@@ -375,7 +375,7 @@ xsltParseStylesheetAttributeSet(xsltStylesheetPtr style, xmlNodePtr cur) { |
attrItems = curAttr; |
goto next_child; |
} |
- if (curAttr->next == NULL) |
+ if (curAttr->next == NULL) |
curAttr->next = xsltNewAttrElem(child); |
curAttr = nextAttr; |
} |
@@ -405,7 +405,7 @@ next_child: |
/* |
* Process attribue "use-attribute-sets". |
*/ |
- /* TODO check recursion */ |
+ /* TODO check recursion */ |
value = xmlGetNsProp(cur, (const xmlChar *)"use-attribute-sets", |
NULL); |
if (value != NULL) { |
@@ -422,7 +422,7 @@ next_child: |
const xmlChar *ncname2 = NULL; |
const xmlChar *prefix2 = NULL; |
xsltAttrElemPtr refAttrItems; |
- |
+ |
#ifdef WITH_XSLT_DEBUG_ATTRIBUTES |
xsltGenericDebug(xsltGenericDebugContext, |
"xsl:attribute-set : %s adds use %s\n", ncname, curval); |
@@ -605,7 +605,7 @@ xsltResolveStylesheetAttributeSet(xsltStylesheetPtr style) { |
#endif |
style->attributeSets = xmlHashCreate(10); |
} |
- xmlHashScanFull(cur->attributeSets, |
+ xmlHashScanFull(cur->attributeSets, |
(xmlHashScannerFull) xsltMergeSASCallback, style); |
/* |
* the attribute lists have either been migrated to style |
@@ -621,7 +621,7 @@ xsltResolveStylesheetAttributeSet(xsltStylesheetPtr style) { |
* Then resolve all the references and computes the resulting sets |
*/ |
if (style->attributeSets != NULL) { |
- xmlHashScanFull(style->attributeSets, |
+ xmlHashScanFull(style->attributeSets, |
(xmlHashScannerFull) xsltResolveSASCallback, style); |
} |
} |
@@ -645,21 +645,22 @@ xsltAttributeInternal(xsltTransformContextPtr ctxt, |
{ |
#ifdef XSLT_REFACTORED |
xsltStyleItemAttributePtr comp = |
- (xsltStyleItemAttributePtr) castedComp; |
+ (xsltStyleItemAttributePtr) castedComp; |
#else |
xsltStylePreCompPtr comp = castedComp; |
#endif |
xmlNodePtr targetElem; |
- xmlChar *prop = NULL; |
+ xmlChar *prop = NULL; |
const xmlChar *name = NULL, *prefix = NULL, *nsName = NULL; |
xmlChar *value = NULL; |
xmlNsPtr ns = NULL; |
- xmlAttrPtr attr; |
+ xmlAttrPtr attr; |
- if ((ctxt == NULL) || (contextNode == NULL) || (inst == NULL)) |
+ if ((ctxt == NULL) || (contextNode == NULL) || (inst == NULL) || |
+ (inst->type != XML_ELEMENT_NODE) ) |
return; |
- /* |
+ /* |
* A comp->has_name == 0 indicates that we need to skip this instruction, |
* since it was evaluated to be invalid already during compilation. |
*/ |
@@ -689,7 +690,7 @@ xsltAttributeInternal(xsltTransformContextPtr ctxt, |
* So report an internal error? |
*/ |
if (ctxt->insert == NULL) |
- return; |
+ return; |
/* |
* SPEC XSLT 1.0: |
* "Adding an attribute to a node that is not an element; |
@@ -701,7 +702,7 @@ xsltAttributeInternal(xsltTransformContextPtr ctxt, |
targetElem = ctxt->insert; |
if (targetElem->type != XML_ELEMENT_NODE) |
return; |
- |
+ |
/* |
* SPEC XSLT 1.0: |
* "Adding an attribute to an element after children have been added |
@@ -727,7 +728,7 @@ xsltAttributeInternal(xsltTransformContextPtr ctxt, |
/* |
* Process the name |
* ---------------- |
- */ |
+ */ |
#ifdef WITH_DEBUGGER |
if (ctxt->debugStatus != XSLT_DEBUG_NONE) |
@@ -749,31 +750,19 @@ xsltAttributeInternal(xsltTransformContextPtr ctxt, |
"valid QName.\n", prop); |
/* we fall through to catch any further errors, if possible */ |
} |
- name = xsltSplitQName(ctxt->dict, prop, &prefix); |
- xmlFree(prop); |
/* |
- * Reject a prefix of "xmlns". |
+ * Reject a name of "xmlns". |
*/ |
- if ((prefix != NULL) && |
- (!xmlStrncasecmp(prefix, (xmlChar *) "xmlns", 5))) |
- { |
-#ifdef WITH_XSLT_DEBUG_PARSING |
- xsltGenericDebug(xsltGenericDebugContext, |
- "xsltAttribute: xmlns prefix forbidden\n"); |
-#endif |
- /* |
- * SPEC XSLT 1.0: |
- * "It is an error if the string that results from instantiating |
- * the attribute value template is not a QName or is the string |
- * xmlns. An XSLT processor may signal the error; if it does not |
- * signal the error, it must recover by not adding the attribute |
- * to the result tree." |
- * TODO: Decide which way to go here. |
- */ |
+ if (xmlStrEqual(prop, BAD_CAST "xmlns")) { |
+ xsltTransformError(ctxt, NULL, inst, |
+ "xsl:attribute: The effective name 'xmlns' is not allowed.\n"); |
+ xmlFree(prop); |
goto error; |
} |
+ name = xsltSplitQName(ctxt->dict, prop, &prefix); |
+ xmlFree(prop); |
} else { |
/* |
* The "name" value was static. |
@@ -785,7 +774,7 @@ xsltAttributeInternal(xsltTransformContextPtr ctxt, |
name = xsltSplitQName(ctxt->dict, comp->name, &prefix); |
#endif |
} |
- |
+ |
/* |
* Process namespace semantics |
* --------------------------- |
@@ -809,9 +798,9 @@ xsltAttributeInternal(xsltTransformContextPtr ctxt, |
*/ |
/* TODO: check attr acquisition wrt to the XSLT namespace */ |
tmpNsName = xsltEvalAttrValueTemplate(ctxt, inst, |
- (const xmlChar *) "namespace", XSLT_NAMESPACE); |
+ (const xmlChar *) "namespace", XSLT_NAMESPACE); |
/* |
- * This fixes bug #302020: The AVT might also evaluate to the |
+ * This fixes bug #302020: The AVT might also evaluate to the |
* empty string; this means that the empty string also indicates |
* "no namespace". |
* SPEC XSLT 1.0: |
@@ -820,8 +809,20 @@ xsltAttributeInternal(xsltTransformContextPtr ctxt, |
*/ |
if ((tmpNsName != NULL) && (tmpNsName[0] != 0)) |
nsName = xmlDictLookup(ctxt->dict, BAD_CAST tmpNsName, -1); |
- xmlFree(tmpNsName); |
- }; |
+ xmlFree(tmpNsName); |
+ } |
+ |
+ if (xmlStrEqual(nsName, BAD_CAST "http://www.w3.org/2000/xmlns/")) { |
+ xsltTransformError(ctxt, NULL, inst, |
+ "xsl:attribute: Namespace http://www.w3.org/2000/xmlns/ " |
+ "forbidden.\n"); |
+ goto error; |
+ } |
+ if (xmlStrEqual(nsName, XML_XML_NAMESPACE)) { |
+ prefix = BAD_CAST "xml"; |
+ } else if (xmlStrEqual(prefix, BAD_CAST "xml")) { |
+ prefix = NULL; |
+ } |
} else if (prefix != NULL) { |
/* |
* SPEC XSLT 1.0: |
@@ -829,7 +830,7 @@ xsltAttributeInternal(xsltTransformContextPtr ctxt, |
* expanded into an expanded-name using the namespace declarations |
* in effect for the xsl:attribute element, *not* including any |
* default namespace declaration." |
- */ |
+ */ |
ns = xmlSearchNs(inst->doc, inst, prefix); |
if (ns == NULL) { |
/* |
@@ -842,7 +843,7 @@ xsltAttributeInternal(xsltTransformContextPtr ctxt, |
"this is an error, since the namespace was not " |
"specified by the instruction itself.\n", prefix, name); |
} else |
- nsName = ns->href; |
+ nsName = ns->href; |
} |
if (fromAttributeSet) { |
@@ -862,9 +863,9 @@ xsltAttributeInternal(xsltTransformContextPtr ctxt, |
* Find/create a matching ns-decl in the result tree. |
*/ |
ns = NULL; |
- |
+ |
#if 0 |
- if (0) { |
+ if (0) { |
/* |
* OPTIMIZE TODO: How do we know if we are adding to a |
* fragment or to the result tree? |
@@ -883,7 +884,7 @@ xsltAttributeInternal(xsltTransformContextPtr ctxt, |
} |
#endif |
- if (nsName != NULL) { |
+ if (nsName != NULL) { |
/* |
* Something about ns-prefixes: |
* SPEC XSLT 1.0: |
@@ -896,11 +897,10 @@ xsltAttributeInternal(xsltTransformContextPtr ctxt, |
* xsl:attribute can produce a scenario where the prefix is NULL, |
* so generate a prefix. |
*/ |
- if (prefix == NULL) { |
+ if ((prefix == NULL) || xmlStrEqual(prefix, BAD_CAST "xmlns")) { |
xmlChar *pref = xmlStrdup(BAD_CAST "ns_1"); |
- ns = xsltGetSpecialNamespace(ctxt, inst, nsName, BAD_CAST pref, |
- targetElem); |
+ ns = xsltGetSpecialNamespace(ctxt, inst, nsName, pref, targetElem); |
xmlFree(pref); |
} else { |
@@ -925,12 +925,12 @@ xsltAttributeInternal(xsltTransformContextPtr ctxt, |
* TODO: Do we need to put the empty string in ? |
*/ |
attr = xmlSetNsProp(ctxt->insert, ns, name, (const xmlChar *) ""); |
- } else if ((inst->children->next == NULL) && |
+ } else if ((inst->children->next == NULL) && |
((inst->children->type == XML_TEXT_NODE) || |
(inst->children->type == XML_CDATA_SECTION_NODE))) |
{ |
xmlNodePtr copyTxt; |
- |
+ |
/* |
* xmlSetNsProp() will take care of duplicates. |
*/ |
@@ -965,7 +965,7 @@ xsltAttributeInternal(xsltTransformContextPtr ctxt, |
*/ |
copyTxt = xmlNewText(inst->children->content); |
if (copyTxt == NULL) /* TODO: report error */ |
- goto error; |
+ goto error; |
} |
attr->children = attr->last = copyTxt; |
copyTxt->parent = (xmlNodePtr) attr; |
@@ -976,7 +976,7 @@ xsltAttributeInternal(xsltTransformContextPtr ctxt, |
* anyway? |
*/ |
if (inst->children->name == xmlStringTextNoenc) |
- copyTxt->name = xmlStringTextNoenc; |
+ copyTxt->name = xmlStringTextNoenc; |
/* |
* since we create the attribute without content IDness must be |
@@ -1005,7 +1005,7 @@ xsltAttributeInternal(xsltTransformContextPtr ctxt, |
} |
error: |
- return; |
+ return; |
} |
/** |
@@ -1041,10 +1041,10 @@ xsltApplyAttributeSet(xsltTransformContextPtr ctxt, xmlNodePtr node, |
const xmlChar *attrSets) |
{ |
const xmlChar *ncname = NULL; |
- const xmlChar *prefix = NULL; |
+ const xmlChar *prefix = NULL; |
const xmlChar *curstr, *endstr; |
xsltAttrElemPtr attrs; |
- xsltStylesheetPtr style; |
+ xsltStylesheetPtr style; |
if (attrSets == NULL) { |
if (inst == NULL) |
@@ -1056,7 +1056,7 @@ xsltApplyAttributeSet(xsltTransformContextPtr ctxt, xmlNodePtr node, |
if (inst->type == XML_ATTRIBUTE_NODE) { |
if ( ((xmlAttrPtr) inst)->children != NULL) |
attrSets = ((xmlAttrPtr) inst)->children->content; |
- |
+ |
} |
if (attrSets == NULL) { |
/* |