summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNick Wellnhofer <wellnhofer@aevum.de>2023-03-15 15:21:09 +0100
committerNick Wellnhofer <wellnhofer@aevum.de>2023-03-15 15:32:09 +0100
commitf13329a622f0370bf1eb72ef99229e8faf46f732 (patch)
tree507e300c00ff39c0ba0508b9364b2e0771bbfe84
parenta8c3824fb1df0e713ed357bb332d63b8475551cf (diff)
downloadlibxslt-f13329a622f0370bf1eb72ef99229e8faf46f732.tar.gz
numbers: Fix another floating point overflow
Check for infinity after applying multiplier.
-rw-r--r--libxslt/numbers.c52
1 files changed, 29 insertions, 23 deletions
diff --git a/libxslt/numbers.c b/libxslt/numbers.c
index c920b12a..8a774a83 100644
--- a/libxslt/numbers.c
+++ b/libxslt/numbers.c
@@ -985,27 +985,12 @@ xsltFormatNumberConversion(xsltDecimalFormatPtr self,
"Invalid format (0-length)\n");
}
*result = NULL;
- switch (xmlXPathIsInf(number)) {
- case -1:
- if (self->minusSign == NULL)
- *result = xmlStrdup(BAD_CAST "-");
- else
- *result = xmlStrdup(self->minusSign);
- /* Intentional fall-through */
- case 1:
- if ((self == NULL) || (self->infinity == NULL))
- *result = xmlStrcat(*result, BAD_CAST "Infinity");
- else
- *result = xmlStrcat(*result, self->infinity);
- return(status);
- default:
- if (xmlXPathIsNaN(number)) {
- if ((self == NULL) || (self->noNumber == NULL))
- *result = xmlStrdup(BAD_CAST "NaN");
- else
- *result = xmlStrdup(self->noNumber);
- return(status);
- }
+ if (xmlXPathIsNaN(number)) {
+ if ((self == NULL) || (self->noNumber == NULL))
+ *result = xmlStrdup(BAD_CAST "NaN");
+ else
+ *result = xmlStrdup(self->noNumber);
+ return(status);
}
buffer = xmlBufferCreate();
@@ -1283,6 +1268,25 @@ OUTPUT_NUMBER:
format_info.add_decimal = TRUE;
}
+ /* Apply multiplier */
+ number *= (double)format_info.multiplier;
+ switch (xmlXPathIsInf(number)) {
+ case -1:
+ if (self->minusSign == NULL)
+ *result = xmlStrdup(BAD_CAST "-");
+ else
+ *result = xmlStrdup(self->minusSign);
+ /* Intentional fall-through */
+ case 1:
+ if ((self == NULL) || (self->infinity == NULL))
+ *result = xmlStrcat(*result, BAD_CAST "Infinity");
+ else
+ *result = xmlStrcat(*result, self->infinity);
+ return(status);
+ default:
+ break;
+ }
+
/* Ready to output our number. First see if "default sign" is required */
if (default_sign != 0)
xmlBufferAdd(buffer, self->minusSign, xmlUTF8Strsize(self->minusSign, 1));
@@ -1297,11 +1301,13 @@ OUTPUT_NUMBER:
j += len;
}
- /* Next do the integer part of the number */
- number = fabs(number) * (double)format_info.multiplier;
+ /* Round to n digits */
+ number = fabs(number);
scale = pow(10.0, (double)(format_info.frac_digits + format_info.frac_hash));
number += .5 / scale;
number -= fmod(number, 1 / scale);
+
+ /* Next do the integer part of the number */
if ((self->grouping != NULL) &&
(self->grouping[0] != 0)) {
int gchar;