summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNick Wellnhofer <wellnhofer@aevum.de>2021-06-16 16:59:43 +0200
committerNick Wellnhofer <wellnhofer@aevum.de>2021-06-16 17:50:32 +0200
commitb9044eaf3a94d33e9087b79f12efb6fe518e8216 (patch)
tree5c42b3c6973173f8436e5fa17100e31294c3237f
parent9352e66ab84de33b0b805f3658a3bab1d19e4f67 (diff)
downloadlibxslt-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.c34
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;