diff options
author | Nick Wellnhofer <wellnhofer@aevum.de> | 2021-06-16 16:59:43 +0200 |
---|---|---|
committer | Nick Wellnhofer <wellnhofer@aevum.de> | 2021-06-16 17:50:32 +0200 |
commit | b9044eaf3a94d33e9087b79f12efb6fe518e8216 (patch) | |
tree | 5c42b3c6973173f8436e5fa17100e31294c3237f | |
parent | 9352e66ab84de33b0b805f3658a3bab1d19e4f67 (diff) | |
download | libxslt-b9044eaf3a94d33e9087b79f12efb6fe518e8216.tar.gz |
Fix regression in xsltComputeSortResult
After implementing locale support, xsltComputeSortResult returned
strings transformed with strxfrm. This confused external users of this
function, mainly WebKit derived browsers implementing their own sort
function, similar to examples/xsltICUSort.c.
Revert to the old behavior for external callers.
-rw-r--r-- | libxslt/xsltutils.c | 34 |
1 files changed, 27 insertions, 7 deletions
diff --git a/libxslt/xsltutils.c b/libxslt/xsltutils.c index bc52c761..fdf7dec2 100644 --- a/libxslt/xsltutils.c +++ b/libxslt/xsltutils.c @@ -948,17 +948,19 @@ xsltDocumentSortFunction(xmlNodeSetPtr list) { } /** - * xsltComputeSortResult: + * xsltComputeSortResultiInternal: * @ctxt: a XSLT process context * @sort: node list + * @xfrm: Transform strings according to locale * * reorder the current node list accordingly to the set of sorting * requirement provided by the array of nodes. * * Returns a ordered XPath nodeset or NULL in case of error. */ -xmlXPathObjectPtr * -xsltComputeSortResult(xsltTransformContextPtr ctxt, xmlNodePtr sort) { +static xmlXPathObjectPtr * +xsltComputeSortResultInternal(xsltTransformContextPtr ctxt, xmlNodePtr sort, + int xfrm) { #ifdef XSLT_REFACTORED xsltStyleItemSortPtr comp; #else @@ -1045,7 +1047,7 @@ xsltComputeSortResult(xsltTransformContextPtr ctxt, xmlNodePtr sort) { } } else { if (res->type == XPATH_STRING) { - if (comp->locale != (xsltLocale)0) { + if ((xfrm) && (comp->locale != (xsltLocale)0)) { xmlChar *str = res->stringval; res->stringval = (xmlChar *) xsltStrxfrm(comp->locale, str); xmlFree(str); @@ -1076,6 +1078,21 @@ xsltComputeSortResult(xsltTransformContextPtr ctxt, xmlNodePtr sort) { } /** + * xsltComputeSortResult: + * @ctxt: a XSLT process context + * @sort: node list + * + * reorder the current node list accordingly to the set of sorting + * requirement provided by the array of nodes. + * + * Returns a ordered XPath nodeset or NULL in case of error. + */ +xmlXPathObjectPtr * +xsltComputeSortResult(xsltTransformContextPtr ctxt, xmlNodePtr sort) { + return xsltComputeSortResultInternal(ctxt, sort, /* xfrm */ 0); +} + +/** * xsltDefaultSortFunction: * @ctxt: a XSLT process context * @sorts: array of sort nodes @@ -1175,7 +1192,8 @@ xsltDefaultSortFunction(xsltTransformContextPtr ctxt, xmlNodePtr *sorts, len = list->nodeNr; - resultsTab[0] = xsltComputeSortResult(ctxt, sorts[0]); + resultsTab[0] = xsltComputeSortResultInternal(ctxt, sorts[0], + /* xfrm */ 1); for (i = 1;i < XSLT_MAX_SORT;i++) resultsTab[i] = NULL; @@ -1246,8 +1264,10 @@ xsltDefaultSortFunction(xsltTransformContextPtr ctxt, xmlNodePtr *sorts, * full set, this might be optimized ... or not */ if (resultsTab[depth] == NULL) - resultsTab[depth] = xsltComputeSortResult(ctxt, - sorts[depth]); + resultsTab[depth] = + xsltComputeSortResultInternal(ctxt, + sorts[depth], + /* xfrm */ 1); res = resultsTab[depth]; if (res == NULL) break; |