diff --git a/main/main.c b/main/main.c index a0f1a658c661a..77136425e3265 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