diff --git a/src/main/java/org/jboss/remoting3/remote/MessageReader.java b/src/main/java/org/jboss/remoting3/remote/MessageReader.java
index 3f5345b2..f22dad5d 100644
--- a/src/main/java/org/jboss/remoting3/remote/MessageReader.java
+++ b/src/main/java/org/jboss/remoting3/remote/MessageReader.java
@@ -41,6 +41,7 @@ final class MessageReader {
     private final ArrayDeque<ByteBuffer> queue = new ArrayDeque<>();
     private final Object lock;
     private final ByteBuffer[] array = new ByteBuffer[16];
+    private static final int INT_OVERFLOW_SIZE_LIMIT = Integer.MAX_VALUE - 4;
 
     static final Pooled<ByteBuffer> EOF_MARKER = Buffers.emptyPooledByteBuffer();
 
@@ -60,7 +61,7 @@ final class MessageReader {
                 if (first != null) {
                     if (first.remaining() >= 4) {
                         int size = first.getInt(first.position());
-                        if (remaining(size + 4)) {
+                        if (remaining(size)) {
                             ByteBuffer message;
                             if (ByteBufferPool.MEDIUM_SIZE >= size) {
                                 message = ByteBufferPool.MEDIUM_HEAP.allocate();
@@ -164,7 +165,12 @@ final class MessageReader {
         }
     }
 
-    private boolean remaining(int cnt) {
+    private boolean remaining(int messageSize) {
+        if (messageSize > INT_OVERFLOW_SIZE_LIMIT) {
+            return false;
+        }
+        // add header to total size
+        int cnt = messageSize + 4;
         int rem = 0;
         for (ByteBuffer buffer : queue) {
             rem += buffer.remaining();
