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

rmaucher pushed a commit to branch 11.0.x
in repository https://gitbox.apache.org/repos/asf/tomcat.git


The following commit(s) were added to refs/heads/11.0.x by this push:
     new 29375c54f9 HTTP/2 fixes from code review
29375c54f9 is described below

commit 29375c54f9610978bca8a4f07c71457e6d5750f9
Author: remm <[email protected]>
AuthorDate: Sun May 31 17:59:45 2026 +0200

    HTTP/2 fixes from code review
---
 java/org/apache/coyote/http2/ConnectionSettingsBase.java   | 6 +++---
 java/org/apache/coyote/http2/HpackDecoder.java             | 4 ++++
 java/org/apache/coyote/http2/Http2AsyncUpgradeHandler.java | 6 +++---
 java/org/apache/coyote/http2/Http2UpgradeHandler.java      | 2 +-
 java/org/apache/coyote/http2/Stream.java                   | 6 +++++-
 5 files changed, 16 insertions(+), 8 deletions(-)

diff --git a/java/org/apache/coyote/http2/ConnectionSettingsBase.java 
b/java/org/apache/coyote/http2/ConnectionSettingsBase.java
index b43db42f91..76382100b0 100644
--- a/java/org/apache/coyote/http2/ConnectionSettingsBase.java
+++ b/java/org/apache/coyote/http2/ConnectionSettingsBase.java
@@ -16,8 +16,8 @@
  */
 package org.apache.coyote.http2;
 
+import java.util.HashMap;
 import java.util.Map;
-import java.util.concurrent.ConcurrentHashMap;
 
 import org.apache.juli.logging.Log;
 import org.apache.juli.logging.LogFactory;
@@ -47,8 +47,8 @@ abstract class ConnectionSettingsBase<T extends Throwable> {
     // Defaults (defined by Tomcat)
     static final long DEFAULT_NO_RFC7540_PRIORITIES = 1;
 
-    Map<Setting,Long> current = new ConcurrentHashMap<>();
-    Map<Setting,Long> pending = new ConcurrentHashMap<>();
+    Map<Setting,Long> current = new HashMap<>();
+    Map<Setting,Long> pending = new HashMap<>();
 
 
     ConnectionSettingsBase(String connectionId) {
diff --git a/java/org/apache/coyote/http2/HpackDecoder.java 
b/java/org/apache/coyote/http2/HpackDecoder.java
index 791d1ff4c6..066769dc17 100644
--- a/java/org/apache/coyote/http2/HpackDecoder.java
+++ b/java/org/apache/coyote/http2/HpackDecoder.java
@@ -154,6 +154,7 @@ public class HpackDecoder {
                     return;
                 }
             } else {
+                // Unreachable
                 throw new 
RuntimeException(sm.getString("hpackdecoder.notImplemented"));
             }
         }
@@ -281,6 +282,9 @@ public class HpackDecoder {
                 log.trace(sm.getString("hpackdecoder.useDynamic", 
Integer.valueOf(adjustedIndex)));
             }
             Hpack.HeaderField headerField = headerTable[adjustedIndex];
+            if (headerField == null) {
+                throw new 
HpackException(sm.getString("hpackdecoder.nullHeader", Integer.valueOf(index)));
+            }
             emitHeader(headerField.name, headerField.value);
         }
     }
diff --git a/java/org/apache/coyote/http2/Http2AsyncUpgradeHandler.java 
b/java/org/apache/coyote/http2/Http2AsyncUpgradeHandler.java
index 83b9adb6d7..f34e8168c7 100644
--- a/java/org/apache/coyote/http2/Http2AsyncUpgradeHandler.java
+++ b/java/org/apache/coyote/http2/Http2AsyncUpgradeHandler.java
@@ -278,7 +278,7 @@ public class Http2AsyncUpgradeHandler extends 
Http2UpgradeHandler {
         ByteUtil.setThreeBytes(frame, 0, 4);
         frame[3] = FrameType.WINDOW_UPDATE.getIdByte();
         ByteUtil.set31Bits(frame, 9, increment);
-        boolean neetToWriteConnectionUpdate = true;
+        boolean needToWriteConnectionUpdate = true;
         // No need to send update from closed stream
         if (stream instanceof Stream && ((Stream) stream).canWrite()) {
             int streamIncrement = ((Stream) 
stream).getWindowUpdateSizeToWrite(increment);
@@ -295,10 +295,10 @@ public class Http2AsyncUpgradeHandler extends 
Http2UpgradeHandler {
                 socketWrapper.write(BlockingMode.SEMI_BLOCK, 
protocol.getWriteTimeout(), TimeUnit.MILLISECONDS, null,
                         SocketWrapperBase.COMPLETE_WRITE, errorCompletion, 
ByteBuffer.wrap(frame),
                         ByteBuffer.wrap(frame2));
-                neetToWriteConnectionUpdate = false;
+                needToWriteConnectionUpdate = false;
             }
         }
-        if (neetToWriteConnectionUpdate) {
+        if (needToWriteConnectionUpdate) {
             socketWrapper.write(BlockingMode.SEMI_BLOCK, 
protocol.getWriteTimeout(), TimeUnit.MILLISECONDS, null,
                     SocketWrapperBase.COMPLETE_WRITE, errorCompletion, 
ByteBuffer.wrap(frame));
         }
diff --git a/java/org/apache/coyote/http2/Http2UpgradeHandler.java 
b/java/org/apache/coyote/http2/Http2UpgradeHandler.java
index e69cbbdb56..b8abba8121 100644
--- a/java/org/apache/coyote/http2/Http2UpgradeHandler.java
+++ b/java/org/apache/coyote/http2/Http2UpgradeHandler.java
@@ -283,7 +283,7 @@ class Http2UpgradeHandler extends AbstractStream implements 
InternalHttpUpgradeH
                 // Settings are only valid on stream 0
                 FrameType.SETTINGS.check(0, settings.length);
 
-                for (int i = 0; i < settings.length % 6; i++) {
+                for (int i = 0; i < settings.length / 6; i++) {
                     int id = ByteUtil.getTwoBytes(settings, i * 6);
                     long value = ByteUtil.getFourBytes(settings, (i * 6) + 2);
                     Setting key = Setting.valueOf(id);
diff --git a/java/org/apache/coyote/http2/Stream.java 
b/java/org/apache/coyote/http2/Stream.java
index 944564ec25..b5de81f69d 100644
--- a/java/org/apache/coyote/http2/Stream.java
+++ b/java/org/apache/coyote/http2/Stream.java
@@ -192,7 +192,11 @@ class Stream extends AbstractNonZeroStream implements 
HeaderEmitter {
                 if (c < '0' || c > '9') {
                     throw new IllegalArgumentException();
                 }
-                port = port * 10 + c - '0';
+                int digit = c - '0';
+                if (port > (Integer.MAX_VALUE - digit) / 10) {
+                    throw new IllegalArgumentException();
+                }
+                port = port * 10 + digit;
             }
             coyoteRequest.setServerPort(port);
 


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to