From 2847eec8dca0dbf5e143849d6d2a9b7b82bc53ea Mon Sep 17 00:00:00 2001 From: Bruno Moreira Date: Sat, 18 Jul 2026 13:39:40 -0400 Subject: [PATCH] fix: Initialise $result in write_log() to handle an empty log message. Fix #46. --- system/core/Log.php | 2 +- tests/codeigniter/core/Log_test.php | 21 +++++++++++++++++++++ 2 files changed, 22 insertions(+), 1 deletion(-) diff --git a/system/core/Log.php b/system/core/Log.php index efee3fe4cc..f90f607ab9 100644 --- a/system/core/Log.php +++ b/system/core/Log.php @@ -231,7 +231,7 @@ public function write_log($level, $msg) $message .= $this->_format_line($level, $date, $msg); - for ($written = 0, $length = self::strlen($message); $written < $length; $written += $result) + for ($result = $written = 0, $length = self::strlen($message); $written < $length; $written += $result) { if (($result = fwrite($fp, self::substr($message, $written))) === FALSE) { diff --git a/tests/codeigniter/core/Log_test.php b/tests/codeigniter/core/Log_test.php index a9f2dedb21..f87be93a96 100644 --- a/tests/codeigniter/core/Log_test.php +++ b/tests/codeigniter/core/Log_test.php @@ -92,4 +92,25 @@ public function test_format_line() "LEVEL - Timestamp --> Message".PHP_EOL ); } + + public function test_write_log_with_empty_message() + { + $this->ci_set_config('log_path', ''); + $this->ci_set_config('log_threshold', 4); + $this->ci_set_config('log_filename', 'empty.log'); + $instance = new Log_empty_format_stub(); + + // _format_line() is overridden to return '', so $message is empty and the + // write loop never runs. Without $result initialised, is_int($result) returns FALSE, + // and write_log() wrongly returns FALSE. + $this->assertTrue($instance->write_log('error', 'discarded')); + } +} + +class Log_empty_format_stub extends CI_Log { + + protected function _format_line($level, $date, $message) + { + return ''; + } }