summaryrefslogtreecommitdiffstats
path: root/system/helpers/file_helper.php
diff options
context:
space:
mode:
authorAndrey Andreev <narf@devilix.net>2014-01-15 16:42:52 +0100
committerAndrey Andreev <narf@devilix.net>2014-01-15 16:42:52 +0100
commitd8b1ad31cf7ee205ddf3cf396b1d1bfa45af49fa (patch)
treec7f9af25914bb61a13aa8df7be69ad73edd74e04 /system/helpers/file_helper.php
parent1b0a6a0c9aaf620d4b45b7392af557e85c6d5339 (diff)
Fix #2822: Incorrect usage of fwrite()
We only used to check (and not always) if the return value of fwrite() is boolean FALSE, while it is possible that the otherwise returned bytecount is less than the length of data that we're trying to write. This allowed incomplete writes over network streams and possibly a few other edge cases.
Diffstat (limited to 'system/helpers/file_helper.php')
-rw-r--r--system/helpers/file_helper.php12
1 files changed, 10 insertions, 2 deletions
diff --git a/system/helpers/file_helper.php b/system/helpers/file_helper.php
index 4b45a62d0..0587740b1 100644
--- a/system/helpers/file_helper.php
+++ b/system/helpers/file_helper.php
@@ -79,11 +79,19 @@ if ( ! function_exists('write_file'))
}
flock($fp, LOCK_EX);
- fwrite($fp, $data);
+
+ for ($written = 0, $length = strlen($data); $written < $length; $written += $result)
+ {
+ if (($result = fwrite($fp, substr($data, $written))) === FALSE)
+ {
+ break;
+ }
+ }
+
flock($fp, LOCK_UN);
fclose($fp);
- return TRUE;
+ return is_int($result);
}
}