This is an automated email from the ASF dual-hosted git repository.

garydgregory pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/commons-beanutils.git


The following commit(s) were added to refs/heads/master by this push:
     new ddc86aa1 Reject negative index values in DefaultResolver.getIndex 
(#432)
ddc86aa1 is described below

commit ddc86aa141e7a2d86cd4469ce0b1e05450b60742
Author: Naveed Khan <[email protected]>
AuthorDate: Tue Aug 4 11:28:22 2026 +0000

    Reject negative index values in DefaultResolver.getIndex (#432)
    
    * reject negative index values in DefaultResolver.getIndex
    
    getIndex returned a parsed negative subscript unvalidated, colliding with 
the -1 sentinel that means the property is not indexed, so callers branching on 
index >= 0 wrote the whole property instead of one element.
    
    * Potential fix for pull request finding
    
    Co-authored-by: Copilot Autofix powered by AI 
<[email protected]>
    
    ---------
    
    Co-authored-by: Gary Gregory <[email protected]>
    Co-authored-by: Copilot Autofix powered by AI 
<[email protected]>
---
 .../org/apache/commons/beanutils2/expression/DefaultResolver.java  | 7 +++++--
 .../java/org/apache/commons/beanutils2/expression/Resolver.java    | 2 +-
 .../apache/commons/beanutils2/expression/DefaultResolverTest.java  | 6 ++++++
 3 files changed, 12 insertions(+), 3 deletions(-)

diff --git 
a/src/main/java/org/apache/commons/beanutils2/expression/DefaultResolver.java 
b/src/main/java/org/apache/commons/beanutils2/expression/DefaultResolver.java
index 7cb053bf..9bcbd71a 100644
--- 
a/src/main/java/org/apache/commons/beanutils2/expression/DefaultResolver.java
+++ 
b/src/main/java/org/apache/commons/beanutils2/expression/DefaultResolver.java
@@ -57,7 +57,7 @@ public class DefaultResolver implements Resolver {
      *
      * @param expression The property expression
      * @return The index value or -1 if the property is not indexed
-     * @throws IllegalArgumentException If the indexed property is illegally 
formed or has an invalid (non-numeric) value.
+     * @throws IllegalArgumentException If the indexed property is illegally 
formed or has an invalid (non-numeric or negative) value.
      */
     @Override
     public int getIndex(final String expression) {
@@ -81,7 +81,10 @@ public class DefaultResolver implements Resolver {
                 int index = 0;
                 try {
                     index = Integer.parseInt(value, 10);
-                } catch (final Exception e) {
+                } catch (final NumberFormatException e) {
+                    throw new IllegalArgumentException("Invalid index value '" 
+ value + "'");
+                }
+                if (index < 0) {
                     throw new IllegalArgumentException("Invalid index value '" 
+ value + "'");
                 }
                 return index;
diff --git 
a/src/main/java/org/apache/commons/beanutils2/expression/Resolver.java 
b/src/main/java/org/apache/commons/beanutils2/expression/Resolver.java
index c6b86c58..f3677995 100644
--- a/src/main/java/org/apache/commons/beanutils2/expression/Resolver.java
+++ b/src/main/java/org/apache/commons/beanutils2/expression/Resolver.java
@@ -91,7 +91,7 @@ public interface Resolver {
      *
      * @param expression The property expression
      * @return The index value or -1 if the property is not indexed
-     * @throws IllegalArgumentException If the indexed property is illegally 
formed or has an invalid (non-numeric) value
+     * @throws IllegalArgumentException If the indexed property is illegally 
formed or has an invalid (non-numeric or negative) value
      */
     int getIndex(String expression);
 
diff --git 
a/src/test/java/org/apache/commons/beanutils2/expression/DefaultResolverTest.java
 
b/src/test/java/org/apache/commons/beanutils2/expression/DefaultResolverTest.java
index 4627cdd9..9a7290e4 100644
--- 
a/src/test/java/org/apache/commons/beanutils2/expression/DefaultResolverTest.java
+++ 
b/src/test/java/org/apache/commons/beanutils2/expression/DefaultResolverTest.java
@@ -105,6 +105,12 @@ class DefaultResolverTest {
         label = "Malformed";
         final IllegalArgumentException e = 
assertThrows(IllegalArgumentException.class, () -> 
resolver.getIndex("foo[BAR]"));
         assertEquals("Invalid index value 'BAR'", e.getMessage(), label + " 
Error Message");
+
+        // Negative
+        label = "Negative";
+        final IllegalArgumentException negative = 
assertThrows(IllegalArgumentException.class, () -> 
resolver.getIndex("foo[-1]"));
+        assertEquals("Invalid index value '-1'", negative.getMessage(), label 
+ " Error Message");
+        assertThrows(IllegalArgumentException.class, () -> 
resolver.getIndex("foo[-12]"));
     }
 
     /**

Reply via email to