Return-Path: X-Original-To: apmail-james-mime4j-dev-archive@minotaur.apache.org Delivered-To: apmail-james-mime4j-dev-archive@minotaur.apache.org Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by minotaur.apache.org (Postfix) with SMTP id 998F29C59 for ; Tue, 22 Nov 2011 08:29:54 +0000 (UTC) Received: (qmail 23419 invoked by uid 500); 22 Nov 2011 08:29:54 -0000 Delivered-To: apmail-james-mime4j-dev-archive@james.apache.org Received: (qmail 23357 invoked by uid 500); 22 Nov 2011 08:29:53 -0000 Mailing-List: contact mime4j-dev-help@james.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: mime4j-dev@james.apache.org Delivered-To: mailing list mime4j-dev@james.apache.org Received: (qmail 23342 invoked by uid 99); 22 Nov 2011 08:29:52 -0000 Received: from athena.apache.org (HELO athena.apache.org) (140.211.11.136) by apache.org (qpsmtpd/0.29) with ESMTP; Tue, 22 Nov 2011 08:29:52 +0000 X-ASF-Spam-Status: No, hits=-2000.0 required=5.0 tests=ALL_TRUSTED X-Spam-Check-By: apache.org Received: from [140.211.11.4] (HELO eris.apache.org) (140.211.11.4) by apache.org (qpsmtpd/0.29) with ESMTP; Tue, 22 Nov 2011 08:29:51 +0000 Received: from eris.apache.org (localhost [127.0.0.1]) by eris.apache.org (Postfix) with ESMTP id DF2D323889DE; Tue, 22 Nov 2011 08:29:30 +0000 (UTC) Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: svn commit: r1204855 - in /james/mime4j/trunk/dom/src: main/java/org/apache/james/mime4j/field/address/LenientAddressBuilder.java test/java/org/apache/james/mime4j/field/address/LenientAddressBuilderTest.java Date: Tue, 22 Nov 2011 08:29:30 -0000 To: mime4j-dev@james.apache.org From: olegk@apache.org X-Mailer: svnmailer-1.0.8-patched Message-Id: <20111122082930.DF2D323889DE@eris.apache.org> Author: olegk Date: Tue Nov 22 08:29:29 2011 New Revision: 1204855 URL: http://svn.apache.org/viewvc?rev=1204855&view=rev Log: MIME4J-207: IndexOutOfBoundsException while parsing email address with a leading 'at' character Modified: james/mime4j/trunk/dom/src/main/java/org/apache/james/mime4j/field/address/LenientAddressBuilder.java james/mime4j/trunk/dom/src/test/java/org/apache/james/mime4j/field/address/LenientAddressBuilderTest.java Modified: james/mime4j/trunk/dom/src/main/java/org/apache/james/mime4j/field/address/LenientAddressBuilder.java URL: http://svn.apache.org/viewvc/james/mime4j/trunk/dom/src/main/java/org/apache/james/mime4j/field/address/LenientAddressBuilder.java?rev=1204855&r1=1204854&r2=1204855&view=diff ============================================================================== --- james/mime4j/trunk/dom/src/main/java/org/apache/james/mime4j/field/address/LenientAddressBuilder.java (original) +++ james/mime4j/trunk/dom/src/main/java/org/apache/james/mime4j/field/address/LenientAddressBuilder.java Tue Nov 22 08:29:29 2011 @@ -50,7 +50,6 @@ public class LenientAddressBuilder { private static final BitSet AT_AND_CLOSING_BRACKET = RawFieldParser.INIT_BITSET(AT, CLOSING_BRACKET); private static final BitSet CLOSING_BRACKET_ONLY = RawFieldParser.INIT_BITSET(CLOSING_BRACKET); - private static final BitSet COMMA_AND_COLON = RawFieldParser.INIT_BITSET(COMMA, COLON); private static final BitSet COMMA_ONLY = RawFieldParser.INIT_BITSET(COMMA); private static final BitSet COLON_ONLY = RawFieldParser.INIT_BITSET(COLON); private static final BitSet SEMICOLON_ONLY = RawFieldParser.INIT_BITSET(SEMICOLON); @@ -81,10 +80,17 @@ public class LenientAddressBuilder { return dst.toString(); } - DomainList parseRoute(final ByteSequence buf, final ParserCursor cursor) { + DomainList parseRoute(final ByteSequence buf, final ParserCursor cursor, final BitSet delimiters) { + BitSet bitset = RawFieldParser.INIT_BITSET(COMMA, COLON); + if (delimiters != null) { + bitset.or(delimiters); + } List domains = null; - while (!cursor.atEnd()) { + for (;;) { this.parser.skipAllWhiteSpace(buf, cursor); + if (cursor.atEnd()) { + break; + } int pos = cursor.getPos(); int current = (char) (buf.byteAt(pos) & 0xff); if (current == AT) { @@ -92,13 +98,16 @@ public class LenientAddressBuilder { } else { break; } - String s = parseDomain(buf, cursor, COMMA_AND_COLON); + String s = parseDomain(buf, cursor, bitset); if (s != null && s.length() > 0) { if (domains == null) { domains = new ArrayList(); } domains.add(s); } + if (cursor.atEnd()) { + break; + } pos = cursor.getPos(); current = (char) (buf.byteAt(pos) & 0xff); if (current == COMMA) { @@ -126,7 +135,7 @@ public class LenientAddressBuilder { } else { return new Mailbox(null, null, openingText, null); } - DomainList domainList = parseRoute(buf, cursor); + DomainList domainList = parseRoute(buf, cursor, CLOSING_BRACKET_ONLY); String localPart = this.parser.parseValue(buf, cursor, AT_AND_CLOSING_BRACKET); if (cursor.atEnd()) { return new Mailbox(openingText, domainList, localPart, null); Modified: james/mime4j/trunk/dom/src/test/java/org/apache/james/mime4j/field/address/LenientAddressBuilderTest.java URL: http://svn.apache.org/viewvc/james/mime4j/trunk/dom/src/test/java/org/apache/james/mime4j/field/address/LenientAddressBuilderTest.java?rev=1204855&r1=1204854&r2=1204855&view=diff ============================================================================== --- james/mime4j/trunk/dom/src/test/java/org/apache/james/mime4j/field/address/LenientAddressBuilderTest.java (original) +++ james/mime4j/trunk/dom/src/test/java/org/apache/james/mime4j/field/address/LenientAddressBuilderTest.java Tue Nov 22 08:29:29 2011 @@ -122,7 +122,7 @@ public class LenientAddressBuilderTest e ByteSequence raw = ContentUtil.encode(s); ParserCursor cursor = new ParserCursor(0, s.length()); - DomainList route = parser.parseRoute(raw, cursor); + DomainList route = parser.parseRoute(raw, cursor, null); assertNotNull(route); assertEquals(3, route.size()); assertEquals("a", route.get(0)); @@ -131,12 +131,26 @@ public class LenientAddressBuilderTest e assertEquals('m', raw.byteAt(cursor.getPos())); } + public void testParseAddressStartingWithAt() throws Exception { + String s = "<@somehost.com@somehost.com>"; + ByteSequence raw = ContentUtil.encode(s); + ParserCursor cursor = new ParserCursor(0, s.length()); + + Mailbox mailbox = parser.parseMailboxAddress(null, raw, cursor); + assertEquals("", mailbox.getLocalPart()); + assertEquals(null, mailbox.getDomain()); + DomainList route = mailbox.getRoute(); + assertNotNull(route); + assertEquals(1, route.size()); + assertEquals("somehost.com@somehost.com", route.get(0)); + } + public void testParseNoRoute() throws Exception { String s = "stuff"; ByteSequence raw = ContentUtil.encode(s); ParserCursor cursor = new ParserCursor(0, s.length()); - DomainList route = parser.parseRoute(raw, cursor); + DomainList route = parser.parseRoute(raw, cursor, null); assertNull(route); }