| Index: third_party/libxml/src/xmlschemas.c
|
| diff --git a/third_party/libxml/src/xmlschemas.c b/third_party/libxml/src/xmlschemas.c
|
| index fe533e6f65ed54122961f6600c056a857c981f60..ee22a6da87d42f5fe5a8f0d9d41ced08a1a459b9 100644
|
| --- a/third_party/libxml/src/xmlschemas.c
|
| +++ b/third_party/libxml/src/xmlschemas.c
|
| @@ -617,7 +617,7 @@ struct _xmlSchemaParserCtxt {
|
| xmlAutomataStatePtr end;
|
| xmlAutomataStatePtr state;
|
|
|
| - xmlDictPtr dict; /* dictionnary for interned string names */
|
| + xmlDictPtr dict; /* dictionary for interned string names */
|
| xmlSchemaTypePtr ctxtType; /* The current context simple/complex type */
|
| int options;
|
| xmlSchemaValidCtxtPtr vctxt;
|
| @@ -27382,10 +27382,17 @@ xmlSchemaSAXHandleStartElementNs(void *ctx,
|
|
|
| for (j = 0, i = 0; i < nb_attributes; i++, j += 5) {
|
| /*
|
| - * Duplicate the value.
|
| + * Duplicate the value, changing any & to a literal ampersand.
|
| + *
|
| + * libxml2 differs from normal SAX here in that it escapes all ampersands
|
| + * as & instead of delivering the raw converted string. Changing the
|
| + * behavior at this point would break applications that use this API, so
|
| + * we are forced to work around it. There is no danger of accidentally
|
| + * decoding some entity other than & in this step because without
|
| + * unescaped ampersands there can be no other entities in the string.
|
| */
|
| - value = xmlStrndup(attributes[j+3],
|
| - attributes[j+4] - attributes[j+3]);
|
| + value = xmlStringLenDecodeEntities(vctxt->parserCtxt, attributes[j+3],
|
| + attributes[j+4] - attributes[j+3], XML_SUBSTITUTE_REF, 0, 0, 0);
|
| /*
|
| * TODO: Set the node line.
|
| */
|
|
|