]> git.ipfire.org Git - thirdparty/apache/httpd.git/commitdiff
Include directives no longer refuse to process symlinks on
authorAndré Malo <nd@apache.org>
Fri, 27 Aug 2004 19:11:21 +0000 (19:11 +0000)
committerAndré Malo <nd@apache.org>
Fri, 27 Aug 2004 19:11:21 +0000 (19:11 +0000)
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

CHANGES
STATUS
server/config.c

diff --git a/CHANGES b/CHANGES
index 57ac361ae3a42e97f8b8f5da8f6d729d1d7b90b4..ee263f1dd4e4ed35c1dfbfca444d5c66d6da624d 100644 (file)
--- 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 44bda2b3eba27d8d7aaa30a46bb4a23ec84d4797..4c3e322d3e9c9177faa855ca203808896a1490d3 100644 (file)
--- 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
index 64e4717c579820cf7cb3c20c423189b9e6705826..ab57e1b43acfc2efc01321cd47290cdaae90b3ab 100644 (file)
@@ -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);
             }
         }
     }