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]

Reply via email to