You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ignite.apache.org by il...@apache.org on 2021/05/07 10:53:34 UTC

[ignite] branch master updated: IGNITE-14687 Fixed capacity check in case of counter overflow - Fixes #9083.

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

ilyak pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/ignite.git


The following commit(s) were added to refs/heads/master by this push:
     new 049ca70  IGNITE-14687 Fixed capacity check in case of counter overflow - Fixes #9083.
049ca70 is described below

commit 049ca7037ed6d148c848a9223b8a0cc9439a8ec6
Author: Sergey Kosarev <ma...@gmail.com>
AuthorDate: Fri May 7 13:32:25 2021 +0300

    IGNITE-14687 Fixed capacity check in case of counter overflow - Fixes #9083.
    
    Signed-off-by: Ilya Kasnacheev <il...@gmail.com>
---
 .../internal/binary/streams/BinaryAbstractOutputStream.java      | 6 +++---
 .../ignite/internal/binary/streams/BinaryHeapOutputStream.java   | 3 ++-
 .../internal/binary/streams/BinaryOffheapOutputStream.java       | 3 ++-
 .../binary/streams/AbstractBinaryStreamByteOrderSelfTest.java    | 5 +++++
 .../internal/binary/streams/BinaryAbstractOutputStreamTest.java  | 9 +++++++++
 5 files changed, 21 insertions(+), 5 deletions(-)

diff --git a/modules/core/src/main/java/org/apache/ignite/internal/binary/streams/BinaryAbstractOutputStream.java b/modules/core/src/main/java/org/apache/ignite/internal/binary/streams/BinaryAbstractOutputStream.java
index 023e71c..e87309d 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/binary/streams/BinaryAbstractOutputStream.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/binary/streams/BinaryAbstractOutputStream.java
@@ -292,10 +292,10 @@ public abstract class BinaryAbstractOutputStream extends BinaryAbstractStream
     protected static int capacity(int curCap, int reqCap) {
         int newCap;
 
-        if (reqCap < MIN_CAP)
-            newCap = MIN_CAP;
-        else if (reqCap > MAX_ARRAY_SIZE)
+        if (reqCap > MAX_ARRAY_SIZE || reqCap <= 0)
             throw new IllegalArgumentException("Required capacity exceeds allowed. Required:" + reqCap);
+        else if (reqCap < MIN_CAP)
+            newCap = MIN_CAP;
         else {
             newCap = Math.max(curCap, MIN_CAP);
 
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/binary/streams/BinaryHeapOutputStream.java b/modules/core/src/main/java/org/apache/ignite/internal/binary/streams/BinaryHeapOutputStream.java
index 0f411b6..4a027e2 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/binary/streams/BinaryHeapOutputStream.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/binary/streams/BinaryHeapOutputStream.java
@@ -59,7 +59,8 @@ public final class BinaryHeapOutputStream extends BinaryAbstractOutputStream {
 
     /** {@inheritDoc} */
     @Override public void ensureCapacity(int cnt) {
-        if (cnt > data.length) {
+        // overflow-conscious code
+        if (cnt - data.length > 0) {
             int newCap = capacity(data.length, cnt);
 
             data = chunk.reallocate(data, newCap);
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/binary/streams/BinaryOffheapOutputStream.java b/modules/core/src/main/java/org/apache/ignite/internal/binary/streams/BinaryOffheapOutputStream.java
index a782286..9fa7698 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/binary/streams/BinaryOffheapOutputStream.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/binary/streams/BinaryOffheapOutputStream.java
@@ -59,7 +59,8 @@ public class BinaryOffheapOutputStream extends BinaryAbstractOutputStream {
 
     /** {@inheritDoc} */
     @Override public void ensureCapacity(int cnt) {
-        if (cnt > cap) {
+        // overflow-conscious code
+        if (cnt - cap > 0) {
             int newCap = capacity(cap, cnt);
 
             ptr = reallocate(ptr, newCap);
diff --git a/modules/core/src/test/java/org/apache/ignite/internal/binary/streams/AbstractBinaryStreamByteOrderSelfTest.java b/modules/core/src/test/java/org/apache/ignite/internal/binary/streams/AbstractBinaryStreamByteOrderSelfTest.java
index 7f83b88..973ef2f 100644
--- a/modules/core/src/test/java/org/apache/ignite/internal/binary/streams/AbstractBinaryStreamByteOrderSelfTest.java
+++ b/modules/core/src/test/java/org/apache/ignite/internal/binary/streams/AbstractBinaryStreamByteOrderSelfTest.java
@@ -406,6 +406,11 @@ public abstract class AbstractBinaryStreamByteOrderSelfTest extends GridCommonAb
         Assert.assertArrayEquals(arr, in.readDoubleArray(ARR_LEN), 0);
     }
 
+    @Test(expected = IllegalArgumentException.class)
+    public void testEnsureCapacityNegative() {
+        out.ensureCapacity(Integer.MIN_VALUE);
+    }
+
     /**
      *
      */
diff --git a/modules/core/src/test/java/org/apache/ignite/internal/binary/streams/BinaryAbstractOutputStreamTest.java b/modules/core/src/test/java/org/apache/ignite/internal/binary/streams/BinaryAbstractOutputStreamTest.java
index 1040813..df44e28 100644
--- a/modules/core/src/test/java/org/apache/ignite/internal/binary/streams/BinaryAbstractOutputStreamTest.java
+++ b/modules/core/src/test/java/org/apache/ignite/internal/binary/streams/BinaryAbstractOutputStreamTest.java
@@ -103,5 +103,14 @@ public class BinaryAbstractOutputStreamTest extends GridCommonAbstractTest {
         catch (IllegalArgumentException ignored) {
             // Expected exception.
         }
+
+        try {
+            BinaryAbstractOutputStream.capacity(0, -1);
+
+            fail();
+        }
+        catch (IllegalArgumentException ignored) {
+            // Expected exception.
+        }
     }
 }