This is an automated email from the ASF dual-hosted git repository.
rmaucher pushed a commit to branch 10.1.x
in repository https://gitbox.apache.org/repos/asf/tomcat.git
The following commit(s) were added to refs/heads/10.1.x by this push:
new 09cce1ed89 HTTP/2 fixes from code review
09cce1ed89 is described below
commit 09cce1ed89eec6f1b38e636b481790ec423f4d10
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 0a177ed0ff..e774e93e10 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;
@@ -48,8 +48,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 022035cb3d..56e540ec0e 100644
--- a/java/org/apache/coyote/http2/Http2AsyncUpgradeHandler.java
+++ b/java/org/apache/coyote/http2/Http2AsyncUpgradeHandler.java
@@ -279,7 +279,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);
@@ -296,10 +296,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 a85ca5cb8d..9cdf393fde 100644
--- a/java/org/apache/coyote/http2/Http2UpgradeHandler.java
+++ b/java/org/apache/coyote/http2/Http2UpgradeHandler.java
@@ -284,7 +284,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 1502dc7509..3140c0a4c9 100644
--- a/java/org/apache/coyote/http2/Stream.java
+++ b/java/org/apache/coyote/http2/Stream.java
@@ -197,7 +197,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]