]> granicus.if.org Git - php/commitdiff
Fix #63839: iconv_mime_decode_headers function is skipping headers
authorChristoph M. Becker <cmbecker69@gmx.de>
Sun, 12 Aug 2018 21:20:41 +0000 (23:20 +0200)
committerChristoph M. Becker <cmbecker69@gmx.de>
Sat, 25 Aug 2018 12:51:13 +0000 (14:51 +0200)
We have to cater to the possibility that `=?` is not the start of an
encoded-word, but rather a literal `=?`.  If a line break is found
while we're still looking for the charset, we can safely assume that
it's a literal `=?`, and act accordingly.

NEWS
ext/iconv/iconv.c
ext/iconv/tests/bug63839.phpt [new file with mode: 0644]

diff --git a/NEWS b/NEWS
index e3bf418fcea49b842249dd9e71e6ff50a4872b16..69087d12d800285e88d3ff61035bc03334988511 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -14,6 +14,8 @@ PHP                                                                        NEWS
   . Fixed bug #76517 (incorrect restoring of LDFLAGS). (sji)
 
 - iconv:
+  . Fixed bug #63839 (iconv_mime_decode_headers function is skipping headers).
+    (cmb)
   . Fixed bug #55146 (iconv_mime_decode_headers() skips some headers). (cmb)
 
 - intl:
index a76b6fd802ea12181e880168795db735450255b5..dd56ebadca938585327514c086b0c1c79ea63503 100644 (file)
@@ -1583,6 +1583,23 @@ static php_iconv_err_t _php_iconv_mime_decode(smart_str *pretval, const char *st
                                        case '*': /* new style delimiter: locale id follows */
                                                scan_stat = 10;
                                                break;
+
+                                       case '\r': case '\n': /* not an encoded-word */
+                                               --p1;
+                                               _php_iconv_appendc(pretval, '=', cd_pl);
+                                               _php_iconv_appendc(pretval, '?', cd_pl);
+                                               err = _php_iconv_appendl(pretval, csname, (size_t)((p1 + 1) - csname), cd_pl);
+                                               if (err != PHP_ICONV_ERR_SUCCESS) {
+                                                       goto out;
+                                               }
+                                               csname = NULL;
+                                               if ((mode & PHP_ICONV_MIME_DECODE_STRICT)) {
+                                                       scan_stat = 12;
+                                               }
+                                               else {
+                                                       scan_stat = 0;
+                                               }
+                                               continue;
                                }
                                if (scan_stat != 2) {
                                        char tmpbuf[80];
diff --git a/ext/iconv/tests/bug63839.phpt b/ext/iconv/tests/bug63839.phpt
new file mode 100644 (file)
index 0000000..22f601e
--- /dev/null
@@ -0,0 +1,71 @@
+--TEST--
+Bug #63839 (iconv_mime_decode_headers function is skipping headers)
+--SKIPIF--
+<?php
+if (!extension_loaded('iconv')) die('skip iconv extension not available');
+?>
+--FILE--
+<?php
+$headers = 'From: "xyz" <xyz@xyz.com>
+To: <xyz@xyz.com>
+Subject: Reply Is? white side-LED =? in Help
+Date: Sat, 22 Dec 2012
+Message-ID: <006f01cde00e$d9f79da0$8de6d8e0>
+MIME-Version: 1.0
+Content-Type: multipart/alternative;
+       boundary="----=_NextPart_000_0070_01CDE03C.F3AFD9A0"
+X-Mailer: Microsoft Office Outlook 12.0
+Thread-Index: Ac3gDtcH2huHjzYcQVmFJPPoWjJogA==
+Content-Language: en-us
+
+';
+var_dump(iconv_mime_decode_headers($headers, ICONV_MIME_DECODE_CONTINUE_ON_ERROR));
+var_dump(iconv_mime_decode_headers($headers, ICONV_MIME_DECODE_STRICT));
+?>
+===DONE===
+--EXPECT--
+array(10) {
+  ["From"]=>
+  string(19) ""xyz" <xyz@xyz.com>"
+  ["To"]=>
+  string(13) "<xyz@xyz.com>"
+  ["Subject"]=>
+  string(35) "Reply Is? white side-LED =? in Help"
+  ["Date"]=>
+  string(16) "Sat, 22 Dec 2012"
+  ["Message-ID"]=>
+  string(32) "<006f01cde00e$d9f79da0$8de6d8e0>"
+  ["MIME-Version"]=>
+  string(3) "1.0"
+  ["Content-Type"]=>
+  string(75) "multipart/alternative; boundary="----=_NextPart_000_0070_01CDE03C.F3AFD9A0""
+  ["X-Mailer"]=>
+  string(29) "Microsoft Office Outlook 12.0"
+  ["Thread-Index"]=>
+  string(32) "Ac3gDtcH2huHjzYcQVmFJPPoWjJogA=="
+  ["Content-Language"]=>
+  string(5) "en-us"
+}
+array(10) {
+  ["From"]=>
+  string(19) ""xyz" <xyz@xyz.com>"
+  ["To"]=>
+  string(13) "<xyz@xyz.com>"
+  ["Subject"]=>
+  string(35) "Reply Is? white side-LED =? in Help"
+  ["Date"]=>
+  string(16) "Sat, 22 Dec 2012"
+  ["Message-ID"]=>
+  string(32) "<006f01cde00e$d9f79da0$8de6d8e0>"
+  ["MIME-Version"]=>
+  string(3) "1.0"
+  ["Content-Type"]=>
+  string(75) "multipart/alternative; boundary="----=_NextPart_000_0070_01CDE03C.F3AFD9A0""
+  ["X-Mailer"]=>
+  string(29) "Microsoft Office Outlook 12.0"
+  ["Thread-Index"]=>
+  string(32) "Ac3gDtcH2huHjzYcQVmFJPPoWjJogA=="
+  ["Content-Language"]=>
+  string(5) "en-us"
+}
+===DONE===