Bug #72561 [Opn->Ver]: 5.2.2 regressed with incorrect seeking in stream wrappers

From: Date: Fri, 08 Jul 2016 08:16:25 +0000
Subject: Bug #72561 [Opn->Ver]: 5.2.2 regressed with incorrect seeking in stream wrappers
References: 1  Groups: php.bugs 
Request: Send a blank email to php-bugs+get-202129@lists.php.net to get a copy of this message
Edit report at https://bugs.php.net/bug.php?id=72561&edit=1 ID: 72561 Updated by: requinix@php.net Reported by: nazar at mokrynskyi dot com Summary: 5.2.2 regressed with incorrect seeking in stream wrappers -Status: Open +Status: Verified Type: Bug -Package: Filesystem function related +Package: Streams related Operating System: Linux PHP Version: 7.1.0alpha1 Block user comment: N Private report: N New Comment: There's some weird magic going on, alright. https://3v4l.org/0oYBR#v550 1. stream_read gets called with the full 8192, implying PHP is automatically buffering the stream. This could be intentional (probably is) and may simply be an issue of documentation, but as a developer I would prefer PHP didn't do that for me. And I'll bet that 99% of stream wrapper code out there expects the method to be called with the specific length instead of the maximum length. 2. stream_tell is not being called. At all. The docs say it should be called when using fseek(), and one would expect it to be called with ftell() but apparently that's not the case, however it looks like PHP is managing the pointer position all by itself. 3. read 3 seek -1 results in ftell()=3 when it should be =2. Then later the read 2 results in ftell()=5 (should be =4). Seems that the relative seek isn't updating the internal pointer? > I believe this should be fixed and backported to stable versions, So we're clear, that would be 5.6.x, 7.0.y, and 7.1.z. Because 5.5 is dead and there's no way any changes would get into versions earlier than that. Previous Comments: ------------------------------------------------------------------------ [2016-07-08 01:33:35] nazar at mokrynskyi dot com Description: ------------ When doing reading/seeking on stream wrapper, PHP does interesting magic under the hood (for instance, reading 3 bytes results in 8192 bytes actually tried to be read in ::stream_read()). This is all fine until it works as expected. Here is demo: https://3v4l.org/3RG7r PHP 5.1.4 - 5.2.1 have expected correct output. hhvm-3.9.1 - 3.12.0 seems to also have optimizations under the hood, but result is correct anyway. PHP 5.2.2+ (including latest 7.1.0-alpha2) regressed and does incorrect seeking which results in wrong position eventually. I believe this should be fixed and backported to stable versions, since I do not see any good workaround here, input in ::stream_seek() is already incorrect. ------------------------------------------------------------------------ -- Edit this bug report at https://bugs.php.net/bug.php?id=72561&edit=1

« previous php.bugs (#202129) next »