Fresh pull from upstream (stable) package feed
[librecmc/package-feed.git] / libs / libxslt / patches / 0014-Handle-negative-xsl-number-values.patch
1 From 69ec3da1b653024aca6515ddd4adc91919dd188e Mon Sep 17 00:00:00 2001
2 From: Nick Wellnhofer <wellnhofer@aevum.de>
3 Date: Sun, 10 Apr 2016 12:51:57 +0200
4 Subject: [PATCH] Handle negative xsl:number values
5
6 According to XSLT 2.0, negative values are a non-recoverable dynamic error.
7 Print an error message and treat negative values as zero.
8
9 Fixes an OOB array access in xsltNumberFormatAlpha.
10 ---
11  libxslt/numbers.c | 17 ++++++++++++++++-
12  1 file changed, 16 insertions(+), 1 deletion(-)
13
14 diff --git a/libxslt/numbers.c b/libxslt/numbers.c
15 index eb087bc..a3cabcf 100644
16 --- a/libxslt/numbers.c
17 +++ b/libxslt/numbers.c
18 @@ -246,7 +246,7 @@ xsltNumberFormatAlpha(xmlBufferPtr buffer,
19         number--;
20         *(--pointer) = alpha_list[((int)fmod(number, alpha_size))];
21         number /= alpha_size;
22 -       if (fabs(number) < 1.0)
23 +       if (number < 1.0)
24             break; /* for */
25      }
26      xmlBufferCCat(buffer, pointer);
27 @@ -442,6 +442,21 @@ xsltNumberFormatInsertNumbers(xsltNumberDataPtr data,
28         number = numbers[(numbers_max - 1) - i];
29          /* Round to nearest like XSLT 2.0 */
30          number = floor(number + 0.5);
31 +        /*
32 +         * XSLT 1.0 isn't clear on how to handle negative numbers, but XSLT
33 +         * 2.0 says:
34 +         *
35 +         *     It is a non-recoverable dynamic error if any undiscarded item
36 +         *     in the atomized sequence supplied as the value of the value
37 +         *     attribute of xsl:number cannot be converted to an integer, or
38 +         *     if the resulting integer is less than 0 (zero).
39 +         */
40 +        if (number < 0.0) {
41 +            xsltTransformError(NULL, NULL, NULL,
42 +                    "xsl-number : negative value\n");
43 +            /* Recover by treating negative values as zero. */
44 +            number = 0.0;
45 +        }
46         if (i < tokens->nTokens) {
47           /*
48            * The "n"th format token will be used to format the "n"th
49 -- 
50 2.8.1
51