Projects
home:Eustace:branches:Eulaceura:Factory
tomcat
_service:obs_scm:CVE-2020-11996.patch
Sign Up
Log In
Username
Password
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
File _service:obs_scm:CVE-2020-11996.patch of Package tomcat
From 9a0231683a77e2957cea0fdee88b193b30b0c976 Mon Sep 17 00:00:00 2001 From: Mark Thomas <markt@apache.org> Date: Fri, 22 May 2020 11:27:49 +0100 Subject: [PATCH] Fix BZ 64467. Improve performance of closing idle streams --- .../coyote/http2/Http2UpgradeHandler.java | 10 +++--- .../coyote/http2/TestHttp2Section_5_1.java | 31 ++++++++++++++++--- webapps/docs/changelog.xml | 4 +++ 3 files changed, 36 insertions(+), 9 deletions(-) diff --git a/java/org/apache/coyote/http2/Http2UpgradeHandler.java b/java/org/apache/coyote/http2/Http2UpgradeHandler.java index bd836940fb..f0d5f27bda 100644 --- a/java/org/apache/coyote/http2/Http2UpgradeHandler.java +++ b/java/org/apache/coyote/http2/Http2UpgradeHandler.java @@ -1343,11 +1343,11 @@ public HeaderEmitter headersStart(int streamId, boolean headersEndStream) } - private void closeIdleStreams(int newMaxActiveRemoteStreamId) throws Http2Exception { - for (int i = maxActiveRemoteStreamId + 2; i < newMaxActiveRemoteStreamId; i += 2) { - Stream stream = getStream(i, false); - if (stream != null) { - stream.closeIfIdle(); + private void closeIdleStreams(int newMaxActiveRemoteStreamId) { + for (Entry<Integer,Stream> entry : streams.entrySet()) { + if (entry.getKey().intValue() > maxActiveRemoteStreamId && + entry.getKey().intValue() < newMaxActiveRemoteStreamId) { + entry.getValue().closeIfIdle(); } } maxActiveRemoteStreamId = newMaxActiveRemoteStreamId; diff --git a/test/org/apache/coyote/http2/TestHttp2Section_5_1.java b/test/org/apache/coyote/http2/TestHttp2Section_5_1.java index 2a466814e1..f878653ecf 100644 --- a/test/org/apache/coyote/http2/TestHttp2Section_5_1.java +++ b/test/org/apache/coyote/http2/TestHttp2Section_5_1.java @@ -147,21 +147,44 @@ public void testClientSendOldStream() throws Exception { @Test public void testImplicitClose() throws Exception { + doTestImplicitClose(5); + } + + + // https://bz.apache.org/bugzilla/show_bug.cgi?id=64467 + @Test + public void testImplicitCloseLargeId() throws Exception { + doTestImplicitClose(Integer.MAX_VALUE - 8); + } + + + private void doTestImplicitClose(int lastStreamId) throws Exception { + + long startFirst = System.nanoTime(); http2Connect(); + long durationFirst = System.nanoTime() - startFirst; sendPriority(3, 0, 16); - sendPriority(5, 0, 16); + sendPriority(lastStreamId, 0, 16); - sendSimpleGetRequest(5); + long startSecond = System.nanoTime(); + sendSimpleGetRequest(lastStreamId); readSimpleGetResponse(); - Assert.assertEquals(getSimpleResponseTrace(5), output.getTrace()); + long durationSecond = System.nanoTime() - startSecond; + + Assert.assertEquals(getSimpleResponseTrace(lastStreamId), output.getTrace()); output.clearTrace(); + // Allow second request to take up to 5 times first request or up to 1 second - whichever is the larger - mainly + // to allow for CI systems under load that can exhibit significant timing variation. + Assert.assertTrue("First request took [" + durationFirst/1000000 + "ms], second request took [" + + durationSecond/1000000 + "ms]", durationSecond < 1000000000 || durationSecond < durationFirst * 3); + // Should trigger an error since stream 3 should have been implicitly // closed. sendSimpleGetRequest(3); - handleGoAwayResponse(5); + handleGoAwayResponse(lastStreamId); } diff --git a/webapps/docs/changelog.xml b/webapps/docs/changelog.xml index 5665df4..7b81937 100644 --- a/webapps/docs/changelog.xml +++ b/webapps/docs/changelog.xml @@ -1803,6 +1803,10 @@ HTTP 205 responses. Additional fix to r1795278. Based on a patch provided by Alexandr Saperov. (violetagg) </fix> + <fix> + <bug>64467</bug>: Improve performance of closing idle HTTP/2 streams. + (markt) + </fix> <update> <bug>61345</bug>: Add a server listener that can be used to do system property replacement from the property source configured in the
Locations
Projects
Search
Status Monitor
Help
Open Build Service
OBS Manuals
API Documentation
OBS Portal
Reporting a Bug
Contact
Mailing List
Forums
Chat (IRC)
Twitter
Open Build Service (OBS)
is an
openSUSE project
.
浙ICP备2022010568号-2