You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by gg...@apache.org on 2026/08/04 11:28:29 UTC

(commons-beanutils) branch master updated: Reject negative index values in DefaultResolver.getIndex (#432)

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 <16...@users.noreply.github.com>
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 <17...@users.noreply.github.com>
    
    ---------
    
    Co-authored-by: Gary Gregory <ga...@users.noreply.github.com>
    Co-authored-by: Copilot Autofix powered by AI <17...@users.noreply.github.com>
---
 .../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]"));
     }
 
     /**