This is an automated email from the ASF dual-hosted git repository. chibenwa pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/james-mime4j.git
commit a6d5dce29a7eb21ab0ba84c958fda5e59cf518fa Author: Benoit TELLIER <[email protected]> AuthorDate: Mon Nov 2 15:25:27 2026 +0000 [FIX] Strict Content-Language and MIME-Version parsers: parse the whole value Both stopped at the first token that did not continue the grammar and reported the valid prefix without a parse exception: "a." read as [a], "4 .1`" as 4.1. ContentLanguageParser now expects the end of the value, and MimeVersionFieldImpl calls parseAll(). Comments and whitespace are skipped tokens, so a trailing comment stays accepted. --- .../org/apache/james/mime4j/field/MimeVersionFieldImpl.java | 3 ++- .../james/mime4j/field/language/ContentLanguageParser.jj | 3 ++- .../apache/james/mime4j/field/ContentLanguageFieldTest.java | 13 +++++++++++++ .../apache/james/mime4j/field/MimeVersionParserTest.java | 12 ++++++++++++ 4 files changed, 29 insertions(+), 2 deletions(-) diff --git a/dom/src/main/java/org/apache/james/mime4j/field/MimeVersionFieldImpl.java b/dom/src/main/java/org/apache/james/mime4j/field/MimeVersionFieldImpl.java index 593f96cf..3c52367c 100644 --- a/dom/src/main/java/org/apache/james/mime4j/field/MimeVersionFieldImpl.java +++ b/dom/src/main/java/org/apache/james/mime4j/field/MimeVersionFieldImpl.java @@ -56,7 +56,8 @@ public class MimeVersionFieldImpl extends AbstractField implements MimeVersionFi StringReader reader = new StringReader(body); MimeVersionParser parser = new MimeVersionParser(reader); try { - parser.parse(); + // The whole value, not only its first valid prefix + parser.parseAll(); int v = parser.getMajorVersion(); if (v != MimeVersionParser.INITIAL_VERSION_VALUE) { major = v; diff --git a/dom/src/main/javacc/org/apache/james/mime4j/field/language/ContentLanguageParser.jj b/dom/src/main/javacc/org/apache/james/mime4j/field/language/ContentLanguageParser.jj index 958fe30a..11c0c698 100644 --- a/dom/src/main/javacc/org/apache/james/mime4j/field/language/ContentLanguageParser.jj +++ b/dom/src/main/javacc/org/apache/james/mime4j/field/language/ContentLanguageParser.jj @@ -71,7 +71,8 @@ private List<String> doParse() : { } { - language() ( "," language() )* + // The whole value, not only its first valid prefix + language() ( "," language() )* <EOF> {return languages;} } diff --git a/dom/src/test/java/org/apache/james/mime4j/field/ContentLanguageFieldTest.java b/dom/src/test/java/org/apache/james/mime4j/field/ContentLanguageFieldTest.java index c753773d..b6d809cb 100644 --- a/dom/src/test/java/org/apache/james/mime4j/field/ContentLanguageFieldTest.java +++ b/dom/src/test/java/org/apache/james/mime4j/field/ContentLanguageFieldTest.java @@ -72,4 +72,17 @@ public class ContentLanguageFieldTest extends TestCase { assertNotNull(f.getParseException()); } + public void testTrailingTextIsAParseError() throws Exception { + for (String value : new String[] {"a.", "na\"\u000e]a\"2p", "en, de;", "en-US x", "en ="}) { + ContentLanguageField f = parse("Content-Language: " + value); + assertEquals(value, 0, f.getLanguages().size()); + assertNotNull(value, f.getParseException()); + } + } + + public void testTrailingCommentAndWhitespaceStayValid() throws Exception { + ContentLanguageField f = parse("Content-Language: en, de (German) "); + assertEquals(2, f.getLanguages().size()); + assertNull(f.getParseException()); + } } diff --git a/dom/src/test/java/org/apache/james/mime4j/field/MimeVersionParserTest.java b/dom/src/test/java/org/apache/james/mime4j/field/MimeVersionParserTest.java index 92c7d8ac..f772825d 100644 --- a/dom/src/test/java/org/apache/james/mime4j/field/MimeVersionParserTest.java +++ b/dom/src/test/java/org/apache/james/mime4j/field/MimeVersionParserTest.java @@ -81,4 +81,16 @@ public class MimeVersionParserTest { Assert.assertEquals(MimeVersionFieldImpl.DEFAULT_MINOR_VERSION, f.getMinorVersion()); Assert.assertNotNull(f.getParseException()); } + + @Test + public void testTrailingTextIsAParseError() throws Exception { + for (String value : new String[] {"1.3 x", "4 .1`", "1.3\u0000\u0000", "1.0;"}) { + MimeVersionField f = parse("MIME-Version: " + value); + f.getMajorVersion(); + Assert.assertNotNull(value, f.getParseException()); + } + // a trailing comment stays valid + check("2.4(A comment)", 2, 4); + check("1.0 (produced by x) ", 1, 0); + } } --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
