This is an automated email from the ASF dual-hosted git repository. remm 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 148d642d0c Improve concurrency resistance 148d642d0c is described below commit 148d642d0ca484bf471fab38bc51b6db7fa5f08f Author: remm <r...@apache.org> AuthorDate: Mon Jul 7 11:30:53 2025 +0200 Improve concurrency resistance Found by Coverity. --- .../coyote/http11/filters/ChunkedInputFilter.java | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/java/org/apache/coyote/http11/filters/ChunkedInputFilter.java b/java/org/apache/coyote/http11/filters/ChunkedInputFilter.java index 75d6efa546..6b15e3260a 100644 --- a/java/org/apache/coyote/http11/filters/ChunkedInputFilter.java +++ b/java/org/apache/coyote/http11/filters/ChunkedInputFilter.java @@ -20,6 +20,7 @@ import java.io.IOException; import java.nio.ByteBuffer; import java.nio.charset.StandardCharsets; import java.util.Set; +import java.util.concurrent.atomic.AtomicLong; import org.apache.coyote.ActionCode; import org.apache.coyote.BadRequestException; @@ -108,7 +109,7 @@ public class ChunkedInputFilter implements InputFilter, ApplicationBufferHandler private volatile boolean crFound = false; private volatile int chunkSizeDigitsRead = 0; private volatile boolean parsingExtension = false; - private volatile long extensionSize; + private final AtomicLong extensionSize = new AtomicLong(0); private final HttpHeaderParser httpHeaderParser; // ----------------------------------------------------------- Constructors @@ -253,7 +254,7 @@ public class ChunkedInputFilter implements InputFilter, ApplicationBufferHandler crFound = false; chunkSizeDigitsRead = 0; parsingExtension = false; - extensionSize = 0; + extensionSize.set(0); httpHeaderParser.recycle(); } @@ -367,7 +368,7 @@ public class ChunkedInputFilter implements InputFilter, ApplicationBufferHandler // semicolons may appear to separate multiple chunk-extensions. // These need to be processed as part of parsing the extensions. parsingExtension = true; - extensionSize++; + extensionSize.incrementAndGet(); } else if (!parsingExtension) { int charValue = HexUtils.getDec(chr); if (charValue != -1 && chunkSizeDigitsRead < 8) { @@ -381,8 +382,8 @@ public class ChunkedInputFilter implements InputFilter, ApplicationBufferHandler // Extension 'parsing' // Note that the chunk-extension is neither parsed nor // validated. Currently it is simply ignored. - extensionSize++; - if (maxExtensionSize > -1 && extensionSize > maxExtensionSize) { + long extSize = extensionSize.incrementAndGet(); + if (maxExtensionSize > -1 && extSize > maxExtensionSize) { throwBadRequestException(sm.getString("chunkedInputFilter.maxExtension")); } } @@ -430,7 +431,7 @@ public class ChunkedInputFilter implements InputFilter, ApplicationBufferHandler // semicolons may appear to separate multiple chunk-extensions. // These need to be processed as part of parsing the extensions. parsingExtension = true; - extensionSize++; + extensionSize.incrementAndGet(); } else if (!parsingExtension) { int charValue = HexUtils.getDec(chr); if (charValue != -1 && chunkSizeDigitsRead < 8) { @@ -444,8 +445,8 @@ public class ChunkedInputFilter implements InputFilter, ApplicationBufferHandler // Extension 'parsing' // Note that the chunk-extension is neither parsed nor // validated. Currently it is simply ignored. - extensionSize++; - if (maxExtensionSize > -1 && extensionSize > maxExtensionSize) { + long extSize = extensionSize.incrementAndGet(); + if (maxExtensionSize > -1 && extSize > maxExtensionSize) { return false; } } --------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org For additional commands, e-mail: dev-h...@tomcat.apache.org