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]

Reply via email to