#18706 [Bgs]: Bug in imap_utf7_decode()
| From: | kalowsky@php.net | Date: | Fri, 02 Aug 2002 14:08:17 +0000 |
| Subject: | #18706 [Bgs]: Bug in imap_utf7_decode() | ||
| References: | 1 | Groups: | php.bugs |
| Request: | Send a blank email to php-bugs+get-15825@lists.php.net to get a copy of this message | ||
ID: 18706
Updated by: kalowsky@php.net
Reported By: gamid@isayev.net
Status: Bogus
Bug Type: IMAP related
PHP Version: 4.2.2
New Comment:
same information at bug #15630
Previous Comments:
------------------------------------------------------------------------
[2002-08-02 10:07:45] kalowsky@php.net
Please do not submit the same bug more than once. An existing
bug report already describes this very problem. Even if you feel
that your issue is somewhat different, the resolution is likely
to be the same. Because of this, we hope you add your comments
to the original bug instead.
Thank you for your interest in PHP.
------------------------------------------------------------------------
[2002-08-02 09:51:25] gamid@isayev.net
Function imap_utf7_decode() in PHP v4.2.2 has bug when IMAP folder name
has non ASCII characters.
Script 'test_utf7.php3' is attached to this posting to illustrate this
bug.
According PHP documentation imap_utf7_decode() returns "the decoded
8bit data", but documentation says nothing about encoding of returned
"8bit data". When I try decode folder with name 'test&AN9ZJw-',
imap_utf7_decode() returns following string:
0x74, 0x65, 0x73, 0x74, 0x00, 0xDF, 0x59, 0x27
It looks as UTF-16 (UCS-2) string with missed '0x00' for ASCII
characters. If I'm right and imap_utf7_decode() returns UTF-16 string,
this string should be represented as:
0x00, 0x74, 0x00, 0x65, 0x00, 0x73, 0x00, 0x74, 0x00, 0xDF, 0x59, 0x27
To fix this this problem I wrote patch for ext/imap/php_imap.c and
attache it to this posting.
Best regards,
Gamid Isayev
--- test_utf7.php3 ------------------------------------
<HTML>
<HEAD>
<TITLE>Test UTF7</TITLE>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html;charset=utf-8">
</HEAD>
<BODY>
<?
$folder = 'test&AN9ZJw-';
echo "folder (modified UTF-7): $folder<BR><BR>\n";
echo "<strong>mb_convert_encoding test</strong><BR>\n";
$test = $folder;
$test = mb_convert_encoding($test, "UTF-8", "UTF7-IMAP");
echo " folder decoded: [$test]<BR>\n";
$test = mb_convert_encoding($test, "UTF7-IMAP", "UTF-8");
echo "encoded again: [", $test, "]<BR>\n";
$test = mb_convert_encoding($test, "UTF-8", "UTF7-IMAP");
echo "decoded again: [", $test, "]<BR><BR>\n";
echo "<strong>imap_utf7_decode test</strong><BR>\n";
$test = $folder;
$test = imap_utf7_decode($test);
echo "folder decoded: [", $test, "]<BR>\n";
$test = imap_utf7_encode($test);
echo "encoded again: [", $test, "]<BR>\n";
$test = imap_utf7_decode($test);
echo "decoded again: [", $test, "]<BR><BR>\n";
?>
</BODY>
</HTML>
--- end of test_utf7.php3 -----------------------------
--- ext/imap/php_imap.c -------------------------------
--- php_imap.c Mon Jul 29 15:17:45 2002
+++ php_imap.c Mon Jul 29 15:18:27 2002
@@ -2215,14 +2215,14 @@
php_error(E_WARNING,
"imap_utf7_decode:
Invalid modified UTF-7 character: `%c'", *inp);
RETURN_FALSE;
} else if (*inp != '&') {
- outlen++;
+ outlen += 2;
} else if (inp + 1 == endp) {
php_error(E_WARNING,
"imap_utf7_decode:
Unexpected end of string");
RETURN_FALSE;
} else if (inp[1] != '-') {
state = ST_DECODE0;
} else {
- outlen++;
+ outlen += 2;
inp++;
}
} else if (*inp == '-') {
@@ -2272,8 +2272,11 @@
if (*inp == '&' && inp[1] != '-') {
state = ST_DECODE0;
}
- else if ((*outp++ = *inp) == '&') {
- inp++;
+ else {
+ *outp++ = 0x00;
+ if ((*outp++ = *inp) == '&') {
+ inp++;
+ }
}
}
else if (*inp == '-') {
--- end of ext/imap/php_imap.c ------------------------
------------------------------------------------------------------------
--
Edit this bug report at http://bugs.php.net/?id=18706&edit=1