From 470364b93844ff651b8e02bf8a8b63498d601f6b Mon Sep 17 00:00:00 2001 From: Chenjp Date: Thu, 21 May 2026 09:58:47 +0800 Subject: [PATCH] =?UTF-8?q?Fix=20implicit=20type=E2=80=91conversion=20prec?= =?UTF-8?q?ision=20issues=20in=20equalsIgnoreCase?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit See testcase. Ascii.toLower(c) implicitly assume c<=0xff. Now add an explicit check. --- java/org/apache/tomcat/util/buf/ByteChunk.java | 2 +- test/org/apache/tomcat/util/buf/TestByteChunk.java | 8 ++++++++ test/org/apache/tomcat/util/http/TestMimeHeaders.java | 11 +++++++++++ 3 files changed, 20 insertions(+), 1 deletion(-) diff --git a/java/org/apache/tomcat/util/buf/ByteChunk.java b/java/org/apache/tomcat/util/buf/ByteChunk.java index e9011d5b3062..ec5431e63127 100644 --- a/java/org/apache/tomcat/util/buf/ByteChunk.java +++ b/java/org/apache/tomcat/util/buf/ByteChunk.java @@ -705,7 +705,7 @@ public boolean equalsIgnoreCase(String s) { } int off = start; for (int i = 0; i < len; i++) { - if (Ascii.toLower(b[off++]) != Ascii.toLower(s.charAt(i))) { + if (s.charAt(i) > 0xff || Ascii.toLower(b[off++]) != Ascii.toLower(s.charAt(i))) { return false; } } diff --git a/test/org/apache/tomcat/util/buf/TestByteChunk.java b/test/org/apache/tomcat/util/buf/TestByteChunk.java index ce8234230e84..9fb24f3814eb 100644 --- a/test/org/apache/tomcat/util/buf/TestByteChunk.java +++ b/test/org/apache/tomcat/util/buf/TestByteChunk.java @@ -143,6 +143,14 @@ public void testFindBytes() throws UnsupportedEncodingException { Assert.assertEquals(-1, ByteChunk.findBytes(bytes, 2, 5, new byte[] { 'w' })); } + @Test + public void testEqualsIgnoreCase() { + byte[] bytes = "Hello".getBytes(); + ByteChunk bc = new ByteChunk(); + bc.setBytes(bytes, 0, bytes.length); + Assert.assertTrue(bc.equalsIgnoreCase("heLLo")); + Assert.assertFalse(bc.equalsIgnoreCase("\u8a48\u8a65\u8a6c\u8a6c\u8a6f")); + } @Test public void testSerialization() throws Exception { diff --git a/test/org/apache/tomcat/util/http/TestMimeHeaders.java b/test/org/apache/tomcat/util/http/TestMimeHeaders.java index efc7832bf711..b72c8eacbe32 100644 --- a/test/org/apache/tomcat/util/http/TestMimeHeaders.java +++ b/test/org/apache/tomcat/util/http/TestMimeHeaders.java @@ -16,6 +16,7 @@ */ package org.apache.tomcat.util.http; +import java.io.UnsupportedEncodingException; import java.util.Enumeration; import java.util.HashSet; import java.util.Set; @@ -32,6 +33,16 @@ public class TestMimeHeaders { public static final String HEADER_NAME_B = "bbb"; public static final String HEADER_NAME_C = "ccc"; + @Test + public void testSetValueBytesIgnoresCase01() throws UnsupportedEncodingException { + MimeHeaders mh = new MimeHeaders(); + + byte[] bytes = HEADER_NAME_UC_STRING.getBytes("utf-8"); + mh.setValue(HEADER_NAME_UC_STRING).setBytes(bytes, 0, bytes.length); + Assert.assertTrue(mh.getValue(HEADER_NAME_UC_STRING).equalsIgnoreCase(HEADER_NAME_MIXED_STRING)); + Assert.assertFalse(mh.getValue(HEADER_NAME_UC_STRING).equalsIgnoreCase("\u8a54\u8a45\u8a53\u8a54")); + } + @Test public void testSetValueStringIgnoresCase01() { MimeHeaders mh = new MimeHeaders();