Commit 6d4e13c1 authored by Andre Malo's avatar Andre Malo
Browse files

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
parent 8fa92169
Loading
Loading
Loading
Loading
+6 −0
Changes for CHANGES: 6 added lines, 0 removed lines.
Original line number Diff line number Diff line
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.
+1 −6
Changes for STATUS: 1 added line, 6 removed lines.
Original line number Diff line number Diff line
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
+20 −6
Changes for server/config.c: 20 added lines, 6 removed lines.
Original line number Diff line number Diff line
@@ -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);
            }
        }
    }