Edit report at https://bugs.php.net/bug.php?id=27792&edit=1
ID: 27792
Comment by: mail dot pourri at laposte dot net
Reported by: kode at kodekrash dot com
Summary: [PATCH] Functions fail on large files
(filesize,is_file,is_dir,readdir)
Status: Critical
Type: Bug
Package: Filesystem function related
Operating System: * (LFS)
PHP Version: 5.*, 6CVS (2009-04-30)
Block user comment: N
Private report: N
New Comment:
This is the most absurd comment I've ever seen!
"The software does not work as expected, please fix your machine."
I've attached a new updated version of the patch against version 5.5.1
I've no time to backport the patch to any previous version, please be my guest
if
you need it.
Some comments about the patch:
1) Changes size_t to off_t at required places in the code (this will only work
if
the LFS mode is specified at compilation/configuration time, that is if you
type
"CFLAGS='-D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64' ./configure --usual-args"
2) Pass all the tests that where passing without the patch
3) Fix a test that was failing without the patch (you can't mmap a pipe's file
descriptor, the patch prevent doing so instead of failing at runtime)
4) Returns a double when/where the file size/offset is larger than 2^32 bytes.
This means that file with size up to 2^52 (the size of a double's mantissa) can
now be used with PHP on 32 bits machine. This is not the plain 64 bits, but
adding
a new type to PHP for 64 bits integer would be a much larger work. For file
size/offset below 2^32 bytes, the previous type (integer) is still used, so
backward compatibility is kept. For file larger than 2^52 bytes, approximate
values are used (this is still not an issue since reading/writing such file
would
still work since it's done in C)
5) Loops on copy_stream/passthru until the complete stream is read, unlike the
previous behavior of only reading up to the first 2GB of the file.
Let me know if it helps.
Previous Comments:
------------------------------------------------------------------------
[2013-05-29 09:57:27] Sjon at hortensius dot net
According to http://3v4l.org/sBClC; this is not a problem on a 64 bits linux
machine (on any php version). I propose (since this bug obviously won't be
fixed)
to close this issue and tell people to use 64 bits machines instead of trying
to
get LFS support in PHP
------------------------------------------------------------------------
[2012-08-09 13:28:31] adu at rdsor dot ro
@marcb
I tested it in "PHP 5.4.0 (cli) (built: Apr 12 2012 13:02:59)) on Ubuntu 12.04
kernel 3.0.0-19 i686" and the BUG is still here.
Reproduced code:
$fname = 'file_of_7GB';
var_dump(filesize( $fname ));
// PHP Warning: filesize(): stat failed for file_of_7GB in php_bug_27792.php
on line 4
// dumps bool(false)
var_dump(is_file( $fname ));
// dumps bool(false)
var_dump(is_dir( $fname ));
// dumps bool(false)
$fname = 'file_of_354MB';
var_dump(filesize( $fname ));
// dumps int(370336155)
var_dump(is_file( $fname ));
// dumps bool(true)
var_dump(is_dir( $fname ));
// dumps bool(false)
------------------------------------------------------------------------
[2011-01-05 04:46:23] marcb at voicemeup dot com
Is anyone able to confirm if this was fixed in any of the 5.X branch ?
This is a pretty stupid problem to have to deal with !
------------------------------------------------------------------------
[2009-11-12 10:27:45] boite dot pour dot spam at gmail dot com
The patch from Wez doesn't work, as it assumes size_t are 64 bits, which is not
the case, even when LFS is defined.
The patch from Mail Pourri works on 5.3.0 (I haven't tested in 5.3.1)
------------------------------------------------------------------------
[2009-09-14 08:59:36] [email protected]
The latest patch for this:
http://www.php.net/~wez/lfs.diff
------------------------------------------------------------------------
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=27792
--
Edit this bug report at https://bugs.php.net/bug.php?id=27792&edit=1