php.net |  support |  documentation |  report a bug |  advanced search |  search howto |  statistics |  random bug |  login
Bug #53061 filesystem functions deal poorly with out of disk space conditions
Submitted: 2010-10-14 06:35 UTC Modified: 2010-11-20 00:07 UTC
From: crrodriguez at opensuse dot org Assigned:
Status: Wont fix Package: Filesystem function related
PHP Version: 5.3SVN-2010-10-14 (SVN) OS: *nix
Private report: No CVE-ID: None
 [2010-10-14 06:35 UTC] crrodriguez at opensuse dot org
Description:
------------
Filesystem functions have IMHO the wrong behaviuor on disk-full conditions

Test script:
---------------
<?php

$fp = fopen('/dev/full', 'wb');
var_dump(fwrite($fp, "fail"));
var_dump(fflush($fp));
var_dump(fclose($fp));

Expected result:
----------------
bool(false) and "warning ...No space left on device.. (aka, handle ENOSPC)
bool(false)
bool(true)

Actual result:
--------------
int(0)
bool(true)
bool(true)


Patches

Pull Requests

History

AllCommentsChangesGit/SVN commitsRelated reports
 [2010-10-14 07:00 UTC] cataphract@php.net
Why would fflush return false? Nothing was written by fwrite, so the flush is a no-op.
 [2010-10-15 02:47 UTC] crrodriguez at opensuse dot org
A liltte bit better test case:

# dd if=/dev/zero of=/tmp/vfs bs=1024 count=1024
# losetup /dev/loop0 /tmp/vfs
# mkfs -t ext2 -m 1 -v /dev/loop0
# mkdir /mnt/vfs
# mount -t ext2 /dev/loop0 /mnt/vfs



<?php

$fp = fopen('/mnt/vfs/foo.txt', 'wb');
var_dump(fwrite($fp, str_repeat("fail", 1024000)));
var_dump(fflush($fp));
var_dump(fclose($fp));
?>

int(1003520)
bool(true)
bool(true)

ls -l /mnt/vfs/foo.txt 
-rw-r--r-- 1 root root 1003520 oct 14 21:43 /mnt/vfs/foo.txt

Partial data on disk, no warning or return values hinting the problem.
 [2010-10-16 02:18 UTC] cataphract@php.net
Well, there's the hint that the return value is smaller than strlen(str_repeat("fail", 1024000)) = 4096000.

I'm not sure if adding a warning here is appropriate, we try to avoid warnings in correct scripts so that programmers don't have to use "@" to have notice/warning free code. Even if we consider a disk full an exceptional circumstance that merited breaking this guideline, a warning would be of little use; unless the logs are in a separate filesystems, the warning message would not be able to be logged.

So:
* We can't return false, because a part of the data may have been written and we need to return how much.
* A warning would be of no use in most circumstances.

Maybe we could return a false+warning if no data has been written, but it seems dangerous because sometimes programmers would be warned of an out-of-disk-space conditional and other times they wouldn't.
 [2010-11-20 00:07 UTC] cataphract@php.net
-Status: Open +Status: Wont fix
 [2010-11-20 00:07 UTC] cataphract@php.net
Closeing as Wont Fix per the exposed reasons.
 
PHP Copyright © 2001-2024 The PHP Group
All rights reserved.
Last updated: Sat Dec 21 12:01:31 2024 UTC