diff --git a/ext/standard/basic_functions.c b/ext/standard/basic_functions.c index aa5c2a2cedf..e0c4230dae2 100644 --- a/ext/standard/basic_functions.c +++ b/ext/standard/basic_functions.c @@ -1988,10 +1988,8 @@ PHP_FUNCTION(ini_set) /* open basedir check */ if (PG(open_basedir)) { if ( - zend_string_equals_literal(varname, "error_log") - || zend_string_equals_literal(varname, "java.class.path") + zend_string_equals_literal(varname, "java.class.path") || zend_string_equals_literal(varname, "java.home") - || zend_string_equals_literal(varname, "mail.log") || zend_string_equals_literal(varname, "java.library.path") || zend_string_equals_literal(varname, "vpopmail.directory") ) { diff --git a/main/main.c b/main/main.c index db7de754143..e33ef29d61b 100644 --- a/main/main.c +++ b/main/main.c @@ -697,12 +697,13 @@ static PHP_INI_MH(OnUpdateErrorLog) { /* Only do the open_basedir check at runtime */ if ((stage == PHP_INI_STAGE_RUNTIME || stage == PHP_INI_STAGE_HTACCESS) && - new_value && zend_string_equals_literal(new_value, "syslog")) { + new_value && !zend_string_equals_literal(new_value, "syslog") && ZSTR_LEN(new_value) > 0) { if (PG(open_basedir) && php_check_open_basedir(ZSTR_VAL(new_value))) { return FAILURE; } } - OnUpdateString(entry, new_value, mh_arg1, mh_arg2, mh_arg3, stage); + char **p = (char **) ZEND_INI_GET_ADDR(); + *p = new_value && ZSTR_LEN(new_value) > 0 ? ZSTR_VAL(new_value) : NULL; return SUCCESS; } /* }}} */ @@ -711,12 +712,13 @@ static PHP_INI_MH(OnUpdateErrorLog) static PHP_INI_MH(OnUpdateMailLog) { /* Only do the open_basedir check at runtime */ - if ((stage == PHP_INI_STAGE_RUNTIME || stage == PHP_INI_STAGE_HTACCESS) && new_value) { + if ((stage == PHP_INI_STAGE_RUNTIME || stage == PHP_INI_STAGE_HTACCESS) && new_value && ZSTR_LEN(new_value) > 0) { if (PG(open_basedir) && php_check_open_basedir(ZSTR_VAL(new_value))) { return FAILURE; } } - OnUpdateString(entry, new_value, mh_arg1, mh_arg2, mh_arg3, stage); + char **p = (char **) ZEND_INI_GET_ADDR(); + *p = new_value && ZSTR_LEN(new_value) > 0 ? ZSTR_VAL(new_value) : NULL; return SUCCESS; } /* }}} */ diff --git a/tests/security/error_log_special_values.phpt b/tests/security/error_log_special_values.phpt new file mode 100644 index 00000000000..949adb5e253 --- /dev/null +++ b/tests/security/error_log_special_values.phpt @@ -0,0 +1,13 @@ +--TEST-- +Setting error_log to special values with open_basedir enabled +--INI-- +open_basedir=foo +error_log= +--FILE-- + +--EXPECT-- +string(0) "" +string(6) "syslog"