This is in response to a debian bug request; basically it just tightens up
the list of allowed characters, so we don't include .dotfiles and backups
etc.
Thoughts?
-Thom

Index: server/config.c
===================================================================
RCS file: /home/cvspublic/httpd-2.0/server/config.c,v
retrieving revision 1.156
diff -u -r1.156 config.c
--- server/config.c     12 Sep 2002 20:04:07 -0000      1.156
+++ server/config.c     21 Nov 2002 01:58:06 -0000
@@ -76,6 +76,7 @@
 #include "apr_portable.h"
 #include "apr_file_io.h"
 #include "apr_fnmatch.h"
+#include "apr_lib.h"
 
 #define APR_WANT_STDIO
 #define APR_WANT_STRFUNC
@@ -1434,6 +1435,20 @@
     return strcmp(f1->fname,f2->fname);
 }
 
+static int fname_valid(const char *fname)
+{
+    const char *c = fname;    
+    if (!apr_isalnum(*c)) 
+      return 0;
+    ++c;
+    while (*c) {
+      if(!apr_isalnum(*c) && *c!='_' && *c!='-' && *c!='.')
+        return 0;
+      ++c;
+    }
+    return 1;
+}
+        
 AP_DECLARE(void) ap_process_resource_config(server_rec *s, const char *fname,
                                             ap_directive_t **conftree,
                                             apr_pool_t *p,
@@ -1510,7 +1525,8 @@
                 && strcmp(dirent.name, "..")
                 && (!ispatt ||
                     apr_fnmatch(pattern, dirent.name, 
-                                FNM_PERIOD) == APR_SUCCESS)) {
+                                FNM_PERIOD) == APR_SUCCESS)
+                && fname_valid(dirent.name)) {
                 fnew = (fnames *) apr_array_push(candidates);
                 fnew->fname = ap_make_full_path(p, path, dirent.name);
             }

Reply via email to