Bug #75910 [Ver->Dup]: convert.base64-encode omits padding bytes

From: Date: Tue, 27 Jul 2021 15:05:34 +0000
Subject: Bug #75910 [Ver->Dup]: convert.base64-encode omits padding bytes
References: 1  Groups: php.bugs 
Request: Send a blank email to php-bugs+get-235411@lists.php.net to get a copy of this message
Edit report at https://bugs.php.net/bug.php?id=75910&edit=1 ID: 75910 Updated by: cmb@php.net Reported by: me at levisflorian dot name Summary: convert.base64-encode omits padding bytes -Status: Verified +Status: Duplicate Type: Bug Package: Streams related Operating System: macOS 10.13.3 (via brew) PHP Version: 7.2.2 -Assigned To: pollita +Assigned To: cmb Block user comment: N Private report: N New Comment: > In the encode cases (let's ignore decode for the moment, but > there may be a hidden issue there too) a partial block has been > written to the stream (base64 uses 3-byte input blocks), meaning > that on read, we don't know if the string is done (and we should > nil bad) or if more data will eventually come (and we should > block). Note that the stream is rewound, before it is read. This requires a flush before the rewind, so the encoding *needs* to be finished. Anyhow, this is actually a duplicate of bug #77069 (fixed as of PHP 7.4.14 and 8.0.1, respectively). Previous Comments: ------------------------------------------------------------------------ [2020-04-24 01:44:37] kazkiti0702 at gmail dot com It doesn't seem to be fixed even in the current latest version. The result of my experiment [Behavior by version] 7.4.5 dGVz 7.3.15 dGVz 7.2.30 dGVz 7.2.28 dGVz 7.2.26 dGVz 7.2.20 dGVz 7.2.1 dGVz 7.2.0 dGVz 7.1.33 dGVzdA== 7.0.33 dGVzdA== 5.6.40 dGVzdA== 5.5.38 dGVzdA== 5.5.30 dGVzdA== 5.4.45 dGVz 5.3.29 dGVz ------------------------------------------------------------------------ [2019-03-22 19:19:15] me at levisflorian dot name Hi, what pollita explained - if I understand correctly - make senses. I have some questions: - is there something in the stream telling it's the end? - is there a way to do the padding "manually"? ------------------------------------------------------------------------ [2019-03-14 15:24:48] pollita@php.net Looking at this, I think your expected is backwards. You *should* expect: encode - low-level - memory = dGVz decode - low-level - memory = test encode - low-level - temp = dGVz decode - low-level - temp = test Which is still not what you get, of course, but before any fixing work is done, we should agree on what's broken. In the encode cases (let's ignore decode for the moment, but there may be a hidden issue there too) a partial block has been written to the stream (base64 uses 3-byte input blocks), meaning that on read, we don't know if the string is done (and we should nil bad) or if more data will eventually come (and we should block). The fact that the stream hasn't been closed means that we should be assuming that additional data will come, ergo we should block, and we should NOT get a second block of encoded data out of the filter. Decode may have a similar issue if we fed it non-block-aligned input (not a multiple of 4-chars), but I haven't verified that either way yet. ------------------------------------------------------------------------ [2019-03-14 12:09:46] alessandro dot lai85 at gmail dot com It seems that this bug is not limited to macOS, and it's affecting PHP 7.2.0 up to the latest 7.3 (which is 7.3.3 RN). Proof: https://3v4l.org/NnFV2 ------------------------------------------------------------------------ [2018-09-20 05:13:08] tenzzor at gmail dot com Hi guys. Found the same issue. I added a patch, which I think might be more generic solution. In case of filtered stream, while loops until eof on stream. However, when we successfully read from stream and reached EOF on stream, flags are still set to NORMAL, next iteration won't happen, because there is EOF and filter is never notified of EOF. This does not happen on php://memory stream right now, because on read it returns all data up to EOF, but does not mark stream as EOF. Then on next read it figures there is no more data in buffer, marks stream as eof and returns 0 read. ------------------------------------------------------------------------ The remainder of the comments for this report are too long. To view the rest of the comments, please view the bug report online at https://bugs.php.net/bug.php?id=75910 -- Edit this bug report at https://bugs.php.net/bug.php?id=75910&edit=1

« previous php.bugs (#235411) next »