|
php.net | support | documentation | report a bug | advanced search | search howto | statistics | random bug | login |
[2009-12-02 20:17 UTC] slusarz at curecanti dot org
Description:
------------
Using the quoted-printable-decode filter on a stream produces an error. However, decoding the string using quoted_printable_decode() does not fail.
The error is thrown whether stream_filter_append() is used or a while !feof()/fwrite()/fread() loop is used.
Reproduce code:
---------------
$a = fopen('php://temp', 'r+');
fwrite($a, "SERVER: [ID job :3453 Backup rotation] Sauvegarde r=c3=a9ussi(e)");
rewind($a);
$b = fopen('php://temp', 'r+');
$c = stream_filter_append($b, 'convert.quoted-printable-decode', STREAM_FILTER_WRITE);
stream_copy_to_stream($a, $b);
rewind($b);
fpassthru($b);
stream_filter_remove($c);
rewind($a);
rewind($b);
fwrite($b, quoted_printable_decode(stream_get_contents($a)));
rewind($b);
fpassthru($b);
Expected result:
----------------
SERVER: [ID job :3453 Backup rotation] Sauvegarde réussi(e)
SERVER: [ID job :3453 Backup rotation] Sauvegarde réussi(e)
Actual result:
--------------
PHP Warning: stream_copy_to_stream(): stream filter (convert.quoted-printable-decode): invalid byte sequence in /tmp/test.php on line 8
SERVER: [ID job :3453 Backup rotation] Sauvegarde réussi(e)
PatchesQP_Patch (last revision 2010-04-29 23:00 UTC by slusarz at curecanti dot org)Pull RequestsHistoryAllCommentsChangesGit/SVN commits
|
|||||||||||||||||||||||||||||||||||||
Copyright © 2001-2025 The PHP GroupAll rights reserved. |
Last updated: Mon Oct 27 09:00:02 2025 UTC |
We have (if I counted right) 3 different implementations for encoding/decoding quoted-printable. And unfortunately filters.c has the buggy one which requires the encoded hex chars be upper-case, since this works: <?php $foo = "Sauvegarder=C3=A9ussi(e)"; // $foo = "Sauvegarder=c3=a9ussi(e)"; // Does not work! $b = fopen('php://temp', 'w+'); stream_filter_append($b, 'convert.quoted-printable-decode', STREAM_FILTER_WRITE); fwrite($b, $foo); rewind($b); fpassthru($b); ?>Here's a patch that works for me. (Doesn't deal with the issue of the duplicative q-p code in PHP, but at least in makes the filtering code work with lowercase hex). --- filters.c.old 2010-02-05 14:56:57.536943283 -0700 +++ filters.c 2010-02-05 14:51:11.353644566 -0700 @@ -1051,18 +1051,17 @@ } /* break is missing intentionally */ case 2: { - unsigned int nbl; - if (icnt <= 0) { goto out; } - nbl = (*ps >= 'A' ? *ps - 0x37 : *ps - 0x30); - if (nbl > 15) { + if (!isxdigit((int) *ps)) { err = PHP_CONV_ERR_INVALID_SEQ; goto out; - } - next_char = (next_char << 4) | nbl; + } + + next_char = (next_char << 4) | (*ps >= 'A' ? *ps - 0x37 : *ps - 0x30); scan_stat++; ps++, icnt--;