Edit report at https://bugs.php.net/bug.php?id=54902&edit=1
ID: 54902
Updated by: cmb@php.net
Reported by: zingaburga at hotmail dot com
Summary: fseek inconsistencies with large (>2GB) files
-Status: Assigned
+Status: Open
-Type: Feature/Change Request
+Type: Documentation Problem
Package: Filesystem function related
Operating System: Windows 7
PHP Version: 5.3.6
-Assigned To: cmb
+Assigned To:
Block user comment: N
Private report: N
New Comment:
I think we should leave that as is, but document the behavior.
Previous Comments:
------------------------------------------------------------------------
[2020-09-01 12:27:22] cmb@php.net
Related To: Bug #74395
------------------------------------------------------------------------
[2020-08-31 08:32:02] cmb@php.net
The following pull request has been associated:
Patch Name: Fix #54902: fseek inconsistencies with large (>2GB) files
On GitHub: https://github.com/php/php-src/pull/6055
Patch: https://github.com/php/php-src/pull/6055.patch
------------------------------------------------------------------------
[2020-08-14 14:20:06] cmb@php.net
The following patch has been added/updated:
Patch Name: position-no-overflow
Revision: 1597414806
URL: https://bugs.php.net/patch-display.php?bug=54902&patch=position-no-overflow&revision=1597414806
------------------------------------------------------------------------
[2020-08-14 14:19:40] cmb@php.net
Ugh, that is indeed ugly. One way to fix this inconsistency would
be to avoid the stream.position to overflow (see the attached
position-no-overflow patch, which doesn't cater to writing,
though). That would make the pastebin example to behave
reasonably. However, that also would prohibit to read beyond the
2GB limit, so would likely break working code, and remove a
basically working feature.
Other than that, we could make the stream.position unsigned. That
still would cause issues, because the stream layer converts
SEEK_CUR seeks to SEEK_SET[1] to cater to stream.position which is
not necessarily what ftell() would report (if the stream even
supports something like ftell()). However, fseek() (or rather
lseek() which is used internally) expect signed offsets, so we
still couldn't seek beyond the 2GB limit â unless we'd rely on
large file support. Not sure if that would be worth the trouble
nowadays.
[1] <https://github.com/php/php-src/blob/php-7.3.21/main/streams/streams.c#L1286-L1291>
------------------------------------------------------------------------
[2011-05-22 05:50:22] zingaburga at hotmail dot com
If you're wondering, I'm using the following function to try to get around the fseek
limitations. It works, but it's really slow for large seeks. If the 8KB limitation could be
lifted, then this function could be serveral times faster.
http://pastebin.com/xWiQxgSB
------------------------------------------------------------------------
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=54902
--
Edit this bug report at https://bugs.php.net/bug.php?id=54902&edit=1