https://bz.apache.org/bugzilla/show_bug.cgi?id=69713

            Bug ID: 69713
           Summary: HTTP/2 DATA frame with padding cause error when
                    HEADERS contains content-length field.
           Product: Tomcat 10
           Version: unspecified
          Hardware: PC
                OS: Linux
            Status: NEW
          Severity: enhancement
          Priority: P2
         Component: Connectors
          Assignee: dev@tomcat.apache.org
          Reporter: kiny...@gmail.com
  Target Milestone: ------

When HEADERS contains 'content-length' field and DATA frame is padded, it
causes Connection error.

tomcat-1  | 12-Jun-2025 02:18:55.721 FINE [https-openssl-nio-8443-exec-4]
org.apache.coyote.http2.Http2UpgradeHandler.upgradeDispatch Connection error
tomcat-1  |     org.apache.coyote.http2.ConnectionException: Connection [0],
Stream [1], The content length header value [3] does not agree with the size of
the data received [127]
tomcat-1  |             at
org.apache.coyote.http2.Stream.receivedData(Stream.java:684)
tomcat-1  |             at
org.apache.coyote.http2.Http2UpgradeHandler.startRequestBodyFrame(Http2UpgradeHandler.java:1553)
tomcat-1  |             at
org.apache.coyote.http2.Http2AsyncUpgradeHandler.startRequestBodyFrame(Http2AsyncUpgradeHandler.java:43)
tomcat-1  |             at
org.apache.coyote.http2.Http2Parser.readDataFrame(Http2Parser.java:191)
tomcat-1  |             at
org.apache.coyote.http2.Http2AsyncParser$FrameCompletionHandler.completed(Http2AsyncParser.java:251)
tomcat-1  |             at
org.apache.coyote.http2.Http2AsyncParser$FrameCompletionHandler.completed(Http2AsyncParser.java:167)
tomcat-1  |             at
org.apache.tomcat.util.net.SocketWrapperBase$VectoredIOCompletionHandler.completed(SocketWrapperBase.java:1040)
tomcat-1  |             at
org.apache.tomcat.util.net.NioEndpoint$NioSocketWrapper$NioOperationState.run(NioEndpoint.java:1687)
tomcat-1  |             at
org.apache.tomcat.util.net.SocketWrapperBase$OperationState.start(SocketWrapperBase.java:987)
tomcat-1  |             at
org.apache.tomcat.util.net.SocketWrapperBase.vectoredOperation(SocketWrapperBase.java:1358)
tomcat-1  |             at
org.apache.tomcat.util.net.SocketWrapperBase.read(SocketWrapperBase.java:1214)
tomcat-1  |             at
org.apache.tomcat.util.net.SocketWrapperBase.read(SocketWrapperBase.java:1190)
tomcat-1  |             at
org.apache.coyote.http2.Http2AsyncParser.readFrame(Http2AsyncParser.java:140)
tomcat-1  |             at
org.apache.coyote.http2.Http2Parser.readFrame(Http2Parser.java:87)
tomcat-1  |             at
org.apache.coyote.http2.Http2UpgradeHandler.upgradeDispatch(Http2UpgradeHandler.java:356)
tomcat-1  |             at
org.apache.coyote.http2.Http2AsyncUpgradeHandler.upgradeDispatch(Http2AsyncUpgradeHandler.java:43)
tomcat-1  |             at
org.apache.coyote.http2.Http2AsyncParser$PrefaceCompletionHandler.completed(Http2AsyncParser.java:130)
tomcat-1  |             at
org.apache.coyote.http2.Http2AsyncParser$PrefaceCompletionHandler.completed(Http2AsyncParser.java:62)
tomcat-1  |             at
org.apache.tomcat.util.net.SocketWrapperBase$VectoredIOCompletionHandler.completed(SocketWrapperBase.java:1040)
tomcat-1  |             at
org.apache.tomcat.util.net.NioEndpoint$NioSocketWrapper$NioOperationState.run(NioEndpoint.java:1687)
tomcat-1  |             at
org.apache.tomcat.util.net.SocketWrapperBase$OperationState.start(SocketWrapperBase.java:987)
tomcat-1  |             at
org.apache.tomcat.util.net.SocketWrapperBase.vectoredOperation(SocketWrapperBase.java:1358)
tomcat-1  |             at
org.apache.tomcat.util.net.SocketWrapperBase.read(SocketWrapperBase.java:1214)
tomcat-1  |             at
org.apache.tomcat.util.net.SocketWrapperBase.read(SocketWrapperBase.java:1190)
tomcat-1  |             at
org.apache.coyote.http2.Http2AsyncParser.readConnectionPreface(Http2AsyncParser.java:57)
tomcat-1  |             at
org.apache.coyote.http2.Http2UpgradeHandler.init(Http2UpgradeHandler.java:248)
tomcat-1  |             at
org.apache.coyote.http2.Http2AsyncUpgradeHandler.init(Http2AsyncUpgradeHandler.java:43)
tomcat-1  |             at
org.apache.coyote.http2.Http2UpgradeHandler.upgradeDispatch(Http2UpgradeHandler.java:334)
tomcat-1  |             at
org.apache.coyote.http2.Http2AsyncUpgradeHandler.upgradeDispatch(Http2AsyncUpgradeHandler.java:43)
tomcat-1  |             at
org.apache.coyote.http11.upgrade.UpgradeProcessorInternal.dispatch(UpgradeProcessorInternal.java:60)
tomcat-1  |             at
org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:57)
tomcat-1  |             at
org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:903)
tomcat-1  |             at
org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1769)
tomcat-1  |             at
org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52)
tomcat-1  |             at
org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1189)
tomcat-1  |             at
org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:658)
tomcat-1  |             at
org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:63)
tomcat-1  |             at java.base/java.lang.Thread.run(Thread.java:1583)

The test of padded DATA frame is here
https://github.com/apache/tomcat/blob/main/test/org/apache/coyote/http2/Http2TestBase.java#L388
https://github.com/apache/tomcat/blob/main/test/org/apache/coyote/http2/TestHttp2Section_6_1.java#L50

But it tests only the case that HEADERS frame does not contain 'content-length'
field.

-- 
You are receiving this mail because:
You are the assignee for the bug.
---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org
For additional commands, e-mail: dev-h...@tomcat.apache.org

Reply via email to