Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 0be299fb authored by Koji Arai's avatar Koji Arai
Browse files

Avoid StringIndexOutOfBoundsException when the header is broken like "=?us-ascii?q?abc?= =?"

parent 1c7d7af9
Loading
Loading
Loading
Loading
+15 −11
Original line number Diff line number Diff line
@@ -110,24 +110,28 @@ public class DecoderUtil {

        while (true) {
            int begin = body.indexOf("=?", previousEnd);
            if (begin == -1) {
                sb.append(body.substring(previousEnd));
                return sb.toString();
            }

            // ANDROID:  The mime4j original version has an error here.  It gets confused if
            // the encoded string begins with an '=' (just after "?Q?").  This patch seeks forward
            // to find the two '?' in the "header", before looking for the final "?=".
            int endScan = begin + 2;
            if (begin != -1) {
                int qm1 = body.indexOf('?', endScan + 2);
                int qm2 = body.indexOf('?', qm1 + 1);
                if (qm2 != -1) {
                    endScan = qm2 + 1;
            int qm1 = body.indexOf('?', begin + 2);
            if (qm1 == -1) {
                sb.append(body.substring(previousEnd));
                return sb.toString();
            }

            int qm2 = body.indexOf('?', qm1 + 1);
            if (qm2 == -1) {
                sb.append(body.substring(previousEnd));
                return sb.toString();
            }

            int end = begin == -1 ? -1 : body.indexOf("?=", endScan);
            int end = body.indexOf("?=", qm2 + 1);
            if (end == -1) {
                if (previousEnd == 0)
                    return body;

                sb.append(body.substring(previousEnd));
                return sb.toString();
            }
+2 −4
Original line number Diff line number Diff line
@@ -57,8 +57,7 @@ public class DecoderUtilTest extends TestCase {
        assertEquals(expect, DecoderUtil.decodeEncodedWords(body, message));

        body = "=??q?a?=";
        expect = "=??q?a?=";
        //expect = "a";
        expect = "a";
        message = null;
        assertEquals(expect, DecoderUtil.decodeEncodedWords(body, message));

@@ -88,8 +87,7 @@ public class DecoderUtilTest extends TestCase {
        assertEquals(expect, DecoderUtil.decodeEncodedWords(body, message));

        body = "=?x?q?X?=";
        expect = "=?x?q?X?=";
        //expect = "X";
        expect = "X";
        message = null;
        assertEquals(expect, DecoderUtil.decodeEncodedWords(body, message));