From: Stefan Fritsch Date: Tue, 31 Jan 2012 21:50:03 +0000 (+0000) Subject: Merge r1225199: X-Git-Tag: 2.4.1~45 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=bb9aa0e0672aa7e2ff6c03e57dfac83618659fc3;p=apache Merge r1225199: Check during configtest that the directories for error logs exist PR: 29941 git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/branches/2.4.x@1238824 13f79535-47bb-0310-9956-ffa450edef68 --- diff --git a/CHANGES b/CHANGES index e9a1aeedea..d035d4b3ef 100644 --- a/CHANGES +++ b/CHANGES @@ -6,6 +6,9 @@ Changes with Apache 2.4.1 when no custom ErrorDocument is specified for status code 400. [Eric Covener] + *) core: Check during configtest that the directories for error logs exist. + PR 29941 [Stefan Fritsch] + *) Core configuration: add AllowOverride option to treat syntax errors in .htaccess as non-fatal. PR 52439 [Nick Kew, Jim Jagielski] diff --git a/server/core.c b/server/core.c index 23537f5c0e..c0c523bb8b 100644 --- a/server/core.c +++ b/server/core.c @@ -4353,6 +4353,44 @@ AP_DECLARE(int) ap_sys_privileges_handlers(int inc) return sys_privileges; } +static int check_errorlog_dir(apr_pool_t *p, server_rec *s) +{ + if (s->error_fname[0] == '|' && strcmp(s->error_fname, "syslog") == 0) { + return APR_SUCCESS; + } + else { + char *abs = ap_server_root_relative(p, s->error_fname); + char *dir = ap_make_dirstr_parent(p, abs); + apr_finfo_t finfo; + apr_status_t rv = apr_stat(&finfo, dir, APR_FINFO_TYPE, p); + if (rv == APR_SUCCESS && finfo.filetype != APR_DIR) + rv = APR_ENOTDIR; + if (rv != APR_SUCCESS) { + const char *desc = "main error log"; + if (s->defn_name) + desc = apr_psprintf(p, "error log of vhost defined at %s:%d", + s->defn_name, s->defn_line_number); + ap_log_error(APLOG_MARK, APLOG_STARTUP|APLOG_EMERG, rv, + ap_server_conf, APLOGNO(02291) + "Cannot access directory '%s' for %s", dir, desc); + return !OK; + } + } + return OK; +} + +static int core_check_config(apr_pool_t *pconf, apr_pool_t *plog, apr_pool_t *ptemp, server_rec *s) +{ + int rv = OK; + while (s) { + if (check_errorlog_dir(ptemp, s) != OK) + rv = !OK; + s = s->next; + } + return rv; +} + + static int core_pre_config(apr_pool_t *pconf, apr_pool_t *plog, apr_pool_t *ptemp) { ap_mutex_init(pconf); @@ -4748,6 +4786,7 @@ static void register_hooks(apr_pool_t *p) ap_hook_pre_config(core_pre_config, NULL, NULL, APR_HOOK_REALLY_FIRST); ap_hook_post_config(core_post_config,NULL,NULL,APR_HOOK_REALLY_FIRST); + ap_hook_check_config(core_check_config,NULL,NULL,APR_HOOK_FIRST); ap_hook_test_config(core_dump_config,NULL,NULL,APR_HOOK_FIRST); ap_hook_translate_name(ap_core_translate,NULL,NULL,APR_HOOK_REALLY_LAST); ap_hook_map_to_storage(core_map_to_storage,NULL,NULL,APR_HOOK_REALLY_LAST);