From ffdf25a2701474a4caae196a0fd980bc3feebd22 Mon Sep 17 00:00:00 2001 From: Mikhail Galanin Date: Thu, 6 Jan 2022 17:09:40 +0000 Subject: [PATCH] Add "error_log_mode" setting --- NEWS | 1 + UPGRADING | 2 ++ main/main.c | 14 ++++++++-- main/php_globals.h | 1 + tests/basic/errorlog_permission.phpt | 38 ++++++++++++++++++++++++++++ 5 files changed, 54 insertions(+), 2 deletions(-) create mode 100644 tests/basic/errorlog_permission.phpt diff --git a/NEWS b/NEWS index 72846b9236c78..93813c2dae53c 100644 --- a/NEWS +++ b/NEWS @@ -15,6 +15,7 @@ PHP NEWS http_build_query(), strstr(), Reflection*::__toString(). (Arnaud) . Fixed bug GH-8995 (WeakMap object reference offset causing TypeError). (Tobias Bachert) + . Added error_log_mode ini setting. (Mikhail Galanin) - COM: . Fixed bug GH-8750 (Can not create VT_ERROR variant type). (cmb) diff --git a/UPGRADING b/UPGRADING index 8dab1ba232568..94117d18293a0 100644 --- a/UPGRADING +++ b/UPGRADING @@ -76,6 +76,8 @@ PHP 8.2 UPGRADE NOTES RFC: https://wiki.php.net/rfc/true-type . Added support for Disjoint Normal Form (DNF) types. RFC: https://wiki.php.net/rfc/dnf_types + . Added error_log_mode ini setting that allows setting of permissions for + error log file. - Curl: diff --git a/main/main.c b/main/main.c index 6c6a91ca53a10..b1b4912369819 100644 --- a/main/main.c +++ b/main/main.c @@ -712,7 +712,8 @@ PHP_INI_BEGIN() STD_PHP_INI_ENTRY("internal_encoding", NULL, PHP_INI_ALL, OnUpdateInternalEncoding, internal_encoding, php_core_globals, core_globals) STD_PHP_INI_ENTRY("input_encoding", NULL, PHP_INI_ALL, OnUpdateInputEncoding, input_encoding, php_core_globals, core_globals) STD_PHP_INI_ENTRY("output_encoding", NULL, PHP_INI_ALL, OnUpdateOutputEncoding, output_encoding, php_core_globals, core_globals) - STD_PHP_INI_ENTRY("error_log", NULL, PHP_INI_ALL, OnUpdateErrorLog, error_log, php_core_globals, core_globals) + STD_PHP_INI_ENTRY("error_log", NULL, PHP_INI_ALL, OnUpdateErrorLog, error_log, php_core_globals, core_globals) + STD_PHP_INI_ENTRY("error_log_mode", "0644", PHP_INI_ALL, OnUpdateLong, error_log_mode, php_core_globals, core_globals) STD_PHP_INI_ENTRY("extension_dir", PHP_EXTENSION_DIR, PHP_INI_SYSTEM, OnUpdateStringUnempty, extension_dir, php_core_globals, core_globals) STD_PHP_INI_ENTRY("sys_temp_dir", NULL, PHP_INI_SYSTEM, OnUpdateStringUnempty, sys_temp_dir, php_core_globals, core_globals) STD_PHP_INI_ENTRY("include_path", PHP_INCLUDE_PATH, PHP_INI_ALL, OnUpdateStringUnempty, include_path, php_core_globals, core_globals) @@ -807,6 +808,8 @@ PHPAPI ZEND_COLD void php_log_err_with_severity(const char *log_message, int sys /* Try to use the specified logging location. */ if (PG(error_log) != NULL) { + int error_log_mode; + #ifdef HAVE_SYSLOG_H if (!strcmp(PG(error_log), "syslog")) { php_syslog(syslog_type_int, "%s", log_message); @@ -814,7 +817,14 @@ PHPAPI ZEND_COLD void php_log_err_with_severity(const char *log_message, int sys return; } #endif - fd = VCWD_OPEN_MODE(PG(error_log), O_CREAT | O_APPEND | O_WRONLY, 0644); + + error_log_mode = 0644; + + if (PG(error_log_mode) > 0 && PG(error_log_mode) <= 0777) { + error_log_mode = PG(error_log_mode); + } + + fd = VCWD_OPEN_MODE(PG(error_log), O_CREAT | O_APPEND | O_WRONLY, error_log_mode); if (fd != -1) { char *tmp; size_t len; diff --git a/main/php_globals.h b/main/php_globals.h index 80152663f4403..cbf0271c7b763 100644 --- a/main/php_globals.h +++ b/main/php_globals.h @@ -165,6 +165,7 @@ struct _php_core_globals { char *syslog_ident; bool have_called_openlog; zend_long syslog_filter; + zend_long error_log_mode; }; diff --git a/tests/basic/errorlog_permission.phpt b/tests/basic/errorlog_permission.phpt new file mode 100644 index 0000000000000..e49c19317621e --- /dev/null +++ b/tests/basic/errorlog_permission.phpt @@ -0,0 +1,38 @@ +--TEST-- +Check permissions for created errorlog file +--SKIPIF-- + +--INI-- +error_log=error_permissions_test.log +error_log_mode=0600 +--FILE-- + +--EXPECTF-- +got permissions=600 +errorlog contents +[%d-%s-%d %d:%d:%d %s] hello world