You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tomcat.apache.org by ma...@apache.org on 2026/06/03 09:40:41 UTC
(tomcat) 01/03: UTF-8 decoder in 9.0.x behaves slightly differently.
This is an automated email from the ASF dual-hosted git repository.
markt-asf pushed a commit to branch 9.0.x
in repository https://gitbox.apache.org/repos/asf/tomcat.git
commit e7766dc99d0e534407e584a314afe9ce27ece1ce
Author: Mark Thomas <ma...@apache.org>
AuthorDate: Wed Jun 3 09:09:05 2026 +0100
UTF-8 decoder in 9.0.x behaves slightly differently.
If the output CharBuffer is full, it returns overflow even if there are
insufficient bytes on input to generate more output.
---
java/org/apache/tomcat/util/buf/B2CConverter.java | 7 +------
test/org/apache/tomcat/util/buf/TestB2CConverter.java | 13 ++++++++-----
2 files changed, 9 insertions(+), 11 deletions(-)
diff --git a/java/org/apache/tomcat/util/buf/B2CConverter.java b/java/org/apache/tomcat/util/buf/B2CConverter.java
index 1a81b6870a..45b0af53e5 100644
--- a/java/org/apache/tomcat/util/buf/B2CConverter.java
+++ b/java/org/apache/tomcat/util/buf/B2CConverter.java
@@ -290,12 +290,7 @@ public class B2CConverter {
result = decoder.decode(bb, cb, endOfInput);
if (result.isError()) {
result.throwException();
- } else if (result.isOverflow()) {
- // Propagate current positions to the byte chunk and char chunk, if
- // this continues the char buffer will get resized
- bc.position(bb.position());
- cc.limit(cb.position());
- } else if (result.isUnderflow()) {
+ } else if (result.isOverflow() || result.isUnderflow()) {
// Propagate current positions to the byte chunk and char chunk
bc.position(bb.position());
cc.limit(cb.position());
diff --git a/test/org/apache/tomcat/util/buf/TestB2CConverter.java b/test/org/apache/tomcat/util/buf/TestB2CConverter.java
index bf7b5bb3e1..89a4765244 100644
--- a/test/org/apache/tomcat/util/buf/TestB2CConverter.java
+++ b/test/org/apache/tomcat/util/buf/TestB2CConverter.java
@@ -180,6 +180,7 @@ public class TestB2CConverter {
@Test
public void testLeftoverBuffer() throws Exception {
// E2 8C A8 is the "keyboard" character
+ // Note: UTF-8 decoder behaviour in 9.0.x is different to 10.1.x onwards
B2CConverter conv = new B2CConverter(StandardCharsets.UTF_8);
ByteBuffer bb = ByteBuffer.allocate(8);
CharBuffer cb = newCharBuffer(1);
@@ -191,24 +192,26 @@ public class TestB2CConverter {
conv.convert(bb, cb, ib, false);
assertCharBufferEquals("A", cb);
- // Will trigger overflow if there is a complete character
+ // Triggers overflow since cb is full
bb.clear();
bb.put((byte) 0xE2);
bb.flip();
conv.convert(bb, cb, ib, false);
assertCharBufferEquals("A", cb);
- // NO-OP (underflow)
+ // NO-OP (still overflow)
conv.convert(bb, cb, ib, false);
assertCharBufferEquals("A", cb);
- // Adds second byte of an incomplete 3 byte character to leftovers
+ // Further decodes will be NO-OPs until cb is expanded.
+
+ // Provide 2nd byte of 3 byte character. Not read as decoder still returns overflow.
ib.setNextRealBytes(new byte[] { (byte) 0x8C });
conv.convert(bb, cb, ib, false);
assertCharBufferEquals("A", cb);
- // Adds final byte of 3 byte character to leftovers. Not converted as output will overflow
- ib.setNextRealBytes(new byte[] { (byte) 0xA8 });
+ // Provide final byte of 3 byte character. Still not read as decoder still returns overflow.
+ ib.setNextRealBytes(new byte[] { (byte) 0x8C, (byte) 0xA8 });
conv.convert(bb, cb, ib, false);
assertCharBufferEquals("A", cb);
---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@tomcat.apache.org
For additional commands, e-mail: dev-help@tomcat.apache.org