Edit report at https://bugs.php.net/bug.php?id=60110&edit=1
ID: 60110
Comment by: tim at bishnet dot net
Reported by: tom at punkave dot com
Summary: fclose(), file_put_contents(), copy() do not return
false properly
Status: Open
Type: Bug
Package: Filesystem function related
Operating System: all
PHP Version: 5.3.8
Block user comment: N
Private report: N
New Comment:
Same issue here using file_put_contents:
82607 open("hello.txt", O_WRONLY|O_CREAT|O_TRUNC, 0666) = 3
82607 fstat(3, {st_mode=S_IFREG|0644, st_size=0, ...}) = 0
82607 lseek(3, 0, SEEK_CUR) = 0
82607 write(3, "Hello, world", 12) = 12
82607 close(3) = -1 EDQUOT (Disk quota exceeded)
Write succeeds but the close fails. file_put_contents doesn't check the result of the close:
https://github.com/php/php-src/blob/master/ext/standard/file.c#L695
Looks unlikely anybody is going to fix this though, given the age of this bug :-(
Previous Comments:
------------------------------------------------------------------------
[2013-05-07 20:16:47] scottix at gmail dot com
Still a bug
PHP 5.4.14 (cli) (built: May 5 2013 12:09:08)
I am using gluster to write to a file and then in the middle of the write I
perform a unplug power shutoff. Gluster goes into lock mode which is good, what
it is supposed to do. Although php doesn't seem to do the right thing, I did a
strace of the fclose and you can clearly see a -1 is sent, but php is ignoring
it.
//Gluster shut off and gluster mount log shows volume down
//fwrite here although can succeed since it buffers
write(3, "Some Text 2", 11) = 11
write(1, "int(11)\n", 8int(11)
) = 8
// Performed fflush(), not sure about this one
write(1, "bool(true)\n", 11bool(true)
) = 11
// Performed fclose() here
close(3) = -1 ENOTCONN (Transport endpoint is not
connected)
write(1, "bool(true)\n", 11bool(true)
Please make this higher priority.
------------------------------------------------------------------------
[2012-08-20 05:38:22] stas@php.net
This looks like a bug, I think it'd be fine to have the fix in 5.4. Any pull reqs
with fixes?
------------------------------------------------------------------------
[2011-12-30 17:25:04] cataphract@php.net
fclose() calls php_stream_close since PHP 5.4, see http://svn.php.net/viewvc?view=revision&revision=309491
------------------------------------------------------------------------
[2011-12-29 04:45:53] tstarling@php.net
It would be nice if the return value of php_stream_close() was checked, but note that fclose() does
not call php_stream_close(), it calls zend_list_delete(), which can't return anything sensible
because rsrc_dtor_func_t returns void.
It would be ugly and difficult to change rsrc_dtor_func_t at this stage, and in any case, during
shutdown or zval destruction we don't really care about flush failures. I think the way to go
would be to call php_stream_close() from fclose() before calling the resource destructor. There
probably won't be any dangling pointers, it looks pretty well guarded already.
As for cataphract's concern: we could audit all the wrapper close functions, there's not
that many of them is there?
------------------------------------------------------------------------
[2011-10-24 17:05:00] tom at punkave dot com
How about a close_checks_flush php.ini flag which defaults to false in 5.3 and to
true in 5.4?
------------------------------------------------------------------------
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=60110
--
Edit this bug report at https://bugs.php.net/bug.php?id=60110&edit=1