]> granicus.if.org Git - php/commitdiff
Fixed bug #51250 (iconv_mime_decode() does not ignore malformed Q-encoded words)
authorIlia Alshanetsky <iliaa@php.net>
Wed, 1 Dec 2010 14:03:36 +0000 (14:03 +0000)
committerIlia Alshanetsky <iliaa@php.net>
Wed, 1 Dec 2010 14:03:36 +0000 (14:03 +0000)
ext/iconv/iconv.c
ext/iconv/tests/bug51250.phpt [new file with mode: 0644]

index 2a272b49aba667299b8f69aba691abe391ee5e21..c3b6daebab78e7f52875140d1e125239e99acdd7 100644 (file)
@@ -1762,10 +1762,10 @@ static php_iconv_err_t _php_iconv_mime_decode(smart_str *pretval, const char *st
                                                        if ((mode & PHP_ICONV_MIME_DECODE_CONTINUE_ON_ERROR)) {
                                                                /* pass the entire chunk through the converter */
                                                                err = _php_iconv_appendl(pretval, encoded_word, (size_t)(p1 - encoded_word), cd_pl); 
+                                                               encoded_word = NULL;
                                                                if (err != PHP_ICONV_ERR_SUCCESS) {
-                                                                       goto out;
+                                                                       break;
                                                                }
-                                                               encoded_word = NULL;
                                                        } else {
                                                                goto out;
                                                        }
diff --git a/ext/iconv/tests/bug51250.phpt b/ext/iconv/tests/bug51250.phpt
new file mode 100644 (file)
index 0000000..fd2e53b
--- /dev/null
@@ -0,0 +1,29 @@
+--TEST--
+Bug #51250 (iconv_mime_decode() does not ignore malformed Q-encoded words)
+--SKIPIF--
+<?php extension_loaded('iconv') or die('skip iconv extension is not available'); ?>
+--FILE--
+<?php
+$m = ICONV_MIME_DECODE_CONTINUE_ON_ERROR;
+
+var_dump(iconv_mime_decode("Legal encoded-word: =?utf-8?B?Kg==?= .", $m));
+var_dump(iconv_mime_decode("Legal encoded-word: =?utf-8?Q?*?= .", $m));
+var_dump(iconv_mime_decode("Illegal encoded-word: =?utf-8?B?".chr(0xA1)."?= .", $m));
+var_dump(iconv_mime_decode("Illegal encoded-word: =?utf-8?Q?".chr(0xA1)."?= .", $m));
+
+var_dump(iconv_mime_decode("Legal encoded-word: =?utf-8?B?Kg==?= ."));
+var_dump(iconv_mime_decode("Legal encoded-word: =?utf-8?Q?*?= ."));
+var_dump(iconv_mime_decode("Illegal encoded-word: =?utf-8?B?".chr(0xA1)."?= ."));
+var_dump(iconv_mime_decode("Illegal encoded-word: =?utf-8?Q?".chr(0xA1)."?= ."));
+?>
+--EXPECTF--
+string(23) "Legal encoded-word: * ."
+string(23) "Legal encoded-word: * ."
+string(24) "Illegal encoded-word:  ."
+string(23) "Illegal encoded-word: ."
+string(23) "Legal encoded-word: * ."
+string(23) "Legal encoded-word: * ."
+string(24) "Illegal encoded-word:  ."
+
+Notice: iconv_mime_decode(): Detected an illegal character in input string in %s on line %d
+bool(false)