From: André Malo Date: Fri, 27 Aug 2004 19:11:21 +0000 (+0000) Subject: Include directives no longer refuse to process symlinks on X-Git-Tag: STRIKER_2_0_51_RC1^2~15 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=b27d479f96fca66b81539e065e3754c1adf6c50e;p=thirdparty%2Fapache%2Fhttpd.git Include directives no longer refuse to process symlinks on directories. Instead there's now a maximum nesting level of included directories (128 as distributed). This is configurable at compile time using the -DAP_MAX_INCLUDE_DIR_DEPTH switch. PR: 28492 Reviewed by: Justin Erenkrantz, Joe Orton git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/branches/APACHE_2_0_BRANCH@104862 13f79535-47bb-0310-9956-ffa450edef68 --- diff --git a/CHANGES b/CHANGES index 57ac361ae3a..ee263f1dd4e 100644 --- a/CHANGES +++ b/CHANGES @@ -1,5 +1,11 @@ Changes with Apache 2.0.51 + *) Include directives no longer refuse to process symlinks on + directories. Instead there's now a maximum nesting level + of included directories (128 as distributed). This is configurable + at compile time using the -DAP_MAX_INCLUDE_DIR_DEPTH switch. + PR 28492. [André Malo] + *) Win32: apache -k start|restart|install|config can leave stranded piped logger processes (eg, rotatelogs.exe) due to improper server shutdown on these code paths. diff --git a/STATUS b/STATUS index 44bda2b3eba..4c3e322d3e9 100644 --- a/STATUS +++ b/STATUS @@ -1,5 +1,5 @@ APACHE 2.0 STATUS: -*-text-*- -Last modified at [$Date: 2004/08/27 18:58:43 $] +Last modified at [$Date: 2004/08/27 19:11:20 $] Release: @@ -145,11 +145,6 @@ PATCHES TO BACKPORT FROM 2.1 jerenkrantz: Icky side-effect of the *t == '0' check. +1: nd, jerenkrantz - *) allow symlinks on directories to be processed by Include directives - and stop possible recursion by a counter. PR 28492 - server/config.c: r1.175 - +1: nd, jerenkrantz, jorton - *) mod_log_config: Cleanup log_header_out function to allow multiple headers like Set-Cookie to be logged properly. PR 27787 (2.0 + 1.3) modules/loggers/mod_log_config.c: r1.116 diff --git a/server/config.c b/server/config.c index 64e4717c579..ab57e1b43ac 100644 --- a/server/config.c +++ b/server/config.c @@ -180,6 +180,11 @@ typedef int (*handler_func)(request_rec *); typedef void *(*dir_maker_func)(apr_pool_t *, char *); typedef void *(*merger_func)(apr_pool_t *, void *, void *); +/* maximum nesting level for config directories */ +#ifndef AP_MAX_INCLUDE_DIR_DEPTH +#define AP_MAX_INCLUDE_DIR_DEPTH (128) +#endif + /* Dealing with config vectors. These are associated with per-directory, * per-server, and per-request configuration, and have a void* pointer for * each modules. The nature of the structure pointed to is private to the @@ -1421,13 +1426,14 @@ static int fname_alphasort(const void *fn1, const void *fn2) static void process_resource_config_nofnmatch(server_rec *s, const char *fname, ap_directive_t **conftree, apr_pool_t *p, - apr_pool_t *ptemp) + apr_pool_t *ptemp, + unsigned depth) { cmd_parms parms; ap_configfile_t *cfp; const char *errmsg; - if (ap_is_rdirectory(p, fname)) { + if (ap_is_directory(p, fname)) { apr_dir_t *dirp; apr_finfo_t dirent; int current; @@ -1436,6 +1442,14 @@ static void process_resource_config_nofnmatch(server_rec *s, const char *fname, apr_status_t rv; char errmsg[120], *path = apr_pstrdup(p, fname); + if (++depth > AP_MAX_INCLUDE_DIR_DEPTH) { + fprintf(stderr, "%s: Directory %s exceeds the maximum include " + "directory nesting level of %u. You have probably a " + "recursion somewhere.\n", ap_server_argv0, path, + AP_MAX_INCLUDE_DIR_DEPTH); + exit(1); + } + /* * first course of business is to grok all the directory * entries here and store 'em away. Recall we need full pathnames @@ -1471,7 +1485,7 @@ static void process_resource_config_nofnmatch(server_rec *s, const char *fname, for (current = 0; current < candidates->nelts; ++current) { fnew = &((fnames *) candidates->elts)[current]; process_resource_config_nofnmatch(s, fnew->fname, conftree, p, - ptemp); + ptemp, depth); } } @@ -1530,7 +1544,7 @@ AP_DECLARE(void) ap_process_resource_config(server_rec *s, const char *fname, } if (!apr_fnmatch_test(fname)) { - process_resource_config_nofnmatch(s, fname, conftree, p, ptemp); + process_resource_config_nofnmatch(s, fname, conftree, p, ptemp, 0); } else { apr_dir_t *dirp; @@ -1553,7 +1567,7 @@ AP_DECLARE(void) ap_process_resource_config(server_rec *s, const char *fname, exit(1); } - if (!ap_is_rdirectory(p, path)){ + if (!ap_is_directory(p, path)){ fprintf(stderr, "%s: Include directory '%s' not found", ap_server_argv0, path); exit(1); @@ -1602,7 +1616,7 @@ AP_DECLARE(void) ap_process_resource_config(server_rec *s, const char *fname, for (current = 0; current < candidates->nelts; ++current) { fnew = &((fnames *) candidates->elts)[current]; process_resource_config_nofnmatch(s, fnew->fname, conftree, p, - ptemp); + ptemp, 0); } } }