Author: markt
Date: Fri Jun 12 09:37:23 2015
New Revision: 1685053

URL: http://svn.apache.org/r1685053
Log:
Protect against windowSize overflow

Modified:
    tomcat/trunk/java/org/apache/coyote/http2/AbstractStream.java

Modified: tomcat/trunk/java/org/apache/coyote/http2/AbstractStream.java
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/coyote/http2/AbstractStream.java?rev=1685053&r1=1685052&r2=1685053&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/coyote/http2/AbstractStream.java (original)
+++ tomcat/trunk/java/org/apache/coyote/http2/AbstractStream.java Fri Jun 12 
09:37:23 2015
@@ -18,7 +18,6 @@ package org.apache.coyote.http2;
 
 import java.util.HashSet;
 import java.util.Set;
-import java.util.concurrent.atomic.AtomicLong;
 
 /**
  * Used to managed prioritisation.
@@ -29,7 +28,8 @@ abstract class AbstractStream {
 
     private volatile AbstractStream parentStream = null;
     private final Set<AbstractStream> childStreams = new HashSet<>();
-    private AtomicLong windowSize = new 
AtomicLong(ConnectionSettings.DEFAULT_WINDOW_SIZE);
+    private long windowSize = ConnectionSettings.DEFAULT_WINDOW_SIZE;
+    private final Object windowSizeLock = new Object();
 
     public Integer getIdentifier() {
         return identifier;
@@ -89,12 +89,16 @@ abstract class AbstractStream {
 
 
     protected void setWindowSize(long windowSize) {
-        this.windowSize.set(windowSize);
+        synchronized (windowSizeLock) {
+            this.windowSize = windowSize;
+        }
     }
 
 
     protected long getWindowSize() {
-        return windowSize.get();
+        synchronized (windowSizeLock) {
+            return windowSize;
+        }
     }
 
 
@@ -103,12 +107,24 @@ abstract class AbstractStream {
      * @throws Http2Exception
      */
     protected void incrementWindowSize(int increment) throws Http2Exception {
-        windowSize.addAndGet(increment);
+        synchronized (windowSizeLock) {
+            // Overflow protection
+            if (Long.MAX_VALUE - increment > windowSize) {
+                windowSize = Long.MAX_VALUE;
+            } else {
+                windowSize += increment;
+            }
+        }
     }
 
 
     protected void decrementWindowSize(int decrement) {
-        windowSize.addAndGet(-decrement);
+        // No need for overflow protection here. Decrement can never be larger
+        // the Integer.MAX_VALUE and once windowSize does negative no further
+        // decrements are permitted
+        synchronized (windowSizeLock) {
+            windowSize -= decrement;
+        }
     }
 
 



---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org
For additional commands, e-mail: dev-h...@tomcat.apache.org

Reply via email to