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

dmollitor pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/avro.git


The following commit(s) were added to refs/heads/main by this push:
     new 9304cb793 AVRO-4070: Optimize Check Max Collection Length for New 
Collections (#3195)
9304cb793 is described below

commit 9304cb793aee4d5b1da56b1dced3b7e65329779f
Author: belugabehr <[email protected]>
AuthorDate: Tue Oct 8 19:33:29 2024 -0400

    AVRO-4070: Optimize Check Max Collection Length for New Collections (#3195)
---
 .../java/org/apache/avro/SystemLimitException.java | 29 ++++++++++++++++++++++
 .../java/org/apache/avro/io/BinaryDecoder.java     |  4 +--
 2 files changed, 31 insertions(+), 2 deletions(-)

diff --git 
a/lang/java/avro/src/main/java/org/apache/avro/SystemLimitException.java 
b/lang/java/avro/src/main/java/org/apache/avro/SystemLimitException.java
index a96f812d8..b4e468345 100644
--- a/lang/java/avro/src/main/java/org/apache/avro/SystemLimitException.java
+++ b/lang/java/avro/src/main/java/org/apache/avro/SystemLimitException.java
@@ -153,6 +153,35 @@ public class SystemLimitException extends 
AvroRuntimeException {
     return (int) length;
   }
 
+  /**
+   * Check to ensure that reading the specified number of items remains within 
the
+   * specified limits.
+   *
+   * @param items The next number of items to read. In normal usage, this is
+   *              always a positive, permitted value. Negative and zero values
+   *              have a special meaning in Avro decoding.
+   * @return The total number of items in the collection if and only if it is
+   *         within the limit and non-negative.
+   * @throws UnsupportedOperationException if reading the items would allocate 
a
+   *                                       collection that the Java VM would be
+   *                                       unable to handle
+   * @throws SystemLimitException          if the decoding should fail because 
it
+   *                                       would otherwise result in an 
allocation
+   *                                       exceeding the set limit
+   * @throws AvroRuntimeException          if the length is negative
+   */
+  public static int checkMaxCollectionLength(long items) {
+    if (items > MAX_ARRAY_VM_LIMIT) {
+      throw new UnsupportedOperationException(
+          "Cannot read collections larger than " + MAX_ARRAY_VM_LIMIT + " 
items in Java library");
+    }
+    if (items > maxCollectionLength) {
+      throw new SystemLimitException(
+          "Collection length " + items + " exceeds the maximum allowed of " + 
maxCollectionLength);
+    }
+    return (int) items;
+  }
+
   /**
    * Check to ensure that reading the string size is within the specified 
limits.
    *
diff --git a/lang/java/avro/src/main/java/org/apache/avro/io/BinaryDecoder.java 
b/lang/java/avro/src/main/java/org/apache/avro/io/BinaryDecoder.java
index 7217be3ad..865bc9c06 100644
--- a/lang/java/avro/src/main/java/org/apache/avro/io/BinaryDecoder.java
+++ b/lang/java/avro/src/main/java/org/apache/avro/io/BinaryDecoder.java
@@ -428,7 +428,7 @@ public class BinaryDecoder extends Decoder {
 
   @Override
   public long readArrayStart() throws IOException {
-    collectionCount = SystemLimitException.checkMaxCollectionLength(0L, 
doReadItemCount());
+    collectionCount = 
SystemLimitException.checkMaxCollectionLength(doReadItemCount());
     return collectionCount;
   }
 
@@ -446,7 +446,7 @@ public class BinaryDecoder extends Decoder {
 
   @Override
   public long readMapStart() throws IOException {
-    collectionCount = SystemLimitException.checkMaxCollectionLength(0L, 
doReadItemCount());
+    collectionCount = 
SystemLimitException.checkMaxCollectionLength(doReadItemCount());
     return collectionCount;
   }
 

Reply via email to