diff options
author | Andrey Andreev <narf@devilix.net> | 2014-01-15 16:42:52 +0100 |
---|---|---|
committer | Andrey Andreev <narf@devilix.net> | 2014-01-15 16:42:52 +0100 |
commit | d8b1ad31cf7ee205ddf3cf396b1d1bfa45af49fa (patch) | |
tree | c7f9af25914bb61a13aa8df7be69ad73edd74e04 /system/core/Log.php | |
parent | 1b0a6a0c9aaf620d4b45b7392af557e85c6d5339 (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/core/Log.php')
-rw-r--r-- | system/core/Log.php | 12 |
1 files changed, 10 insertions, 2 deletions
diff --git a/system/core/Log.php b/system/core/Log.php index ff3c63568..63fef2088 100644 --- a/system/core/Log.php +++ b/system/core/Log.php @@ -178,7 +178,15 @@ class CI_Log { $message .= $level.' - '.date($this->_date_fmt).' --> '.$msg."\n"; flock($fp, LOCK_EX); - fwrite($fp, $message); + + for ($written = 0, $length = strlen($message); $written < $length; $written += $result) + { + if (($result = fwrite($fp, substr($message, $written))) === FALSE) + { + break; + } + } + flock($fp, LOCK_UN); fclose($fp); @@ -187,7 +195,7 @@ class CI_Log { @chmod($filepath, FILE_WRITE_MODE); } - return TRUE; + return is_int($result); } } |