Author: fanningpj
Date: Sat Jun 6 08:57:25 2026
New Revision: 1935058
Log:
[XMLBeans-666] XsTypeConverter: Fix out-of-bounds read in trimTrailingZeros for
empty decimal
. Thanks to aizu-m. This closes #36
Modified:
xmlbeans/trunk/src/main/java/org/apache/xmlbeans/impl/util/XsTypeConverter.java
xmlbeans/trunk/src/test/java/misc/checkin/XsTypeConverterTest.java
Modified:
xmlbeans/trunk/src/main/java/org/apache/xmlbeans/impl/util/XsTypeConverter.java
==============================================================================
---
xmlbeans/trunk/src/main/java/org/apache/xmlbeans/impl/util/XsTypeConverter.java
Sat Jun 6 04:20:07 2026 (r1935057)
+++
xmlbeans/trunk/src/main/java/org/apache/xmlbeans/impl/util/XsTypeConverter.java
Sat Jun 6 08:57:25 2026 (r1935058)
@@ -558,7 +558,7 @@ public final class XsTypeConverter {
private static String trimTrailingZeros(String xsd_decimal) {
final int last_char_idx = xsd_decimal.length() - 1;
- if (xsd_decimal.charAt(last_char_idx) == '0') {
+ if (last_char_idx >= 0 && xsd_decimal.charAt(last_char_idx) == '0') {
final int last_point = xsd_decimal.lastIndexOf('.');
if (last_point >= 0) {
//find last trailing zero
Modified: xmlbeans/trunk/src/test/java/misc/checkin/XsTypeConverterTest.java
==============================================================================
--- xmlbeans/trunk/src/test/java/misc/checkin/XsTypeConverterTest.java Sat Jun
6 04:20:07 2026 (r1935057)
+++ xmlbeans/trunk/src/test/java/misc/checkin/XsTypeConverterTest.java Sat Jun
6 08:57:25 2026 (r1935058)
@@ -76,4 +76,17 @@ public class XsTypeConverterTest {
assertEquals(Float.POSITIVE_INFINITY, XsTypeConverter.lexFloat("INF"));
assertEquals(Float.NEGATIVE_INFINITY,
XsTypeConverter.lexFloat("-INF"));
}
+
+ @Test
+ void lexDecimalRejectsEmptyString() {
+ // an empty value used to read charAt(-1) in trimTrailingZeros and
+ // throw StringIndexOutOfBoundsException instead of
NumberFormatException.
+ assertThrows(NumberFormatException.class, () ->
XsTypeConverter.lexDecimal(""));
+ }
+
+ @Test
+ void lexDecimalTrimsTrailingZeros() {
+ assertEquals(0, new
java.math.BigDecimal("1.5").compareTo(XsTypeConverter.lexDecimal("1.500")));
+ assertEquals(0, new
java.math.BigDecimal("12").compareTo(XsTypeConverter.lexDecimal("12.000")));
+ }
}
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]