You are viewing a plain text version of this content. The canonical link for it is here.
Posted to apache-bugdb@apache.org by Nobuyoshi Miyokawa <nm...@hic.co.jp> on 1998/03/12 10:05:05 UTC

general/1938: Directory/Location match becomes fail if DocumentRoot has extra slash at end.

>Number:         1938
>Category:       general
>Synopsis:       Directory/Location match becomes fail if DocumentRoot has extra slash at end.
>Confidential:   no
>Severity:       non-critical
>Priority:       medium
>Responsible:    apache
>State:          open
>Class:          sw-bug
>Submitter-Id:   apache
>Arrival-Date:   Thu Mar 12 01:10:00 PST 1998
>Last-Modified:
>Originator:     nmiyo@hic.co.jp
>Organization:
apache
>Release:        1.2.5
>Environment:
OS: FreeBSD 2.2.5-RELEASE i386(No patch was applied)
Compiler: gcc-2.7.2.1
>Description:
  If DocumentRoot directive is set a path which has extra slash at end,
such as "/foo/bar/baz/", Directory/Location directive does not match correctly.
For Example, if DocumentRoot directive is set to '/foo/bar/baz/' and we
write,

  <Directory /foo/bar/baz/quux/>
    IndexIgnore foo
  </Directory>

to httpd.conf, IndexIgnore directive does not match to http://WebServer/quux/.
It's work correctly if DocumentRoot directive is set to '/foo/bar/baz'(No
last slash).  I think it may be specification, but, this behavior is not 
fail safe.

  Same thing is occurred if DOCUMENT_LOCATION is defined incorrectly.
>How-To-Repeat:
See above.
>Fix:
Short and Dirty(;-() patch is here:

--- http_core.c.orig    Thu Mar 12 12:48:34 1998
+++ http_core.c Thu Mar 12 17:31:34 1998
@@ -183,7 +183,18 @@
     int is_virtual = s->is_virtual;
   
     conf->access_name = is_virtual ? NULL : DEFAULT_ACCESS_FNAME;
-    conf->document_root = is_virtual ? NULL : DOCUMENT_LOCATION;
+    if (is_virtual) {
+      conf->document_root = NULL;
+    } else if (DOCUMENT_LOCATION[strlen(DOCUMENT_LOCATION)-1] == '/') {
+      int i;
+      for (i = strlen(DOCUMENT_LOCATION);
+          i > 1 && DOCUMENT_LOCATION[i-1] == '/';
+          i--) 
+       ;
+      conf->document_root = pstrndup(a, DOCUMENT_LOCATION, i);
+    } else {
+      conf->document_root = DOCUMENT_LOCATION;
+    }
     conf->sec = make_array (a, 40, sizeof(void *));
     conf->sec_url = make_array (a, 40, sizeof(void *));
     
@@ -432,7 +443,15 @@
        else
            return "DocumentRoot must be a directory";
     
-    conf->document_root = arg;
+    if (arg[strlen(arg)-1] == '/') {
+      int i;
+      for (i = strlen(arg); i > 1 && arg[i-1] == '/'; i--) 
+       ;
+      conf->document_root = pstrndup(cmd->pool, arg, i);
+    } else {
+      conf->document_root = arg;
+    }
+
     return NULL;
 }

%0
>Audit-Trail:
>Unformatted:
[In order for any reply to be added to the PR database, ]
[you need to include <ap...@Apache.Org> in the Cc line ]
[and leave the subject line UNCHANGED.  This is not done]
[automatically because of the potential for mail loops. ]