You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@httpd.apache.org by Jeremy Smith <je...@pinacol.com> on 2008/09/29 02:28:08 UTC

Patch for mod_vhost_alias

I've made a simple patch to mod_vhost_alias.  I've never done this 
before, so I'm probably going about it the wrong way, but here it is.

Problem: mod_vhost_alias provides no ability to failover in the event 
that the transformed VirtualDocumentRoot does not exist.

Solution: Check transformed VDR and return DECLINE if directory does not 
exist.  Then, httpd will default to the regular DocumentRoot (if it was 
defined alongside VirtualDocumentRoot).

I'm not even sure if this behavior is considered "OK" - it's just what I 
needed and I grew a bit frustrated that it was not available.  It might 
be more prudent to put such a thing in a separate config option in case 
someone depends on the 404 that they get from a failed VDR 
transformation (I can't think of any situation that would require this, 
but who knows?)

Here's my patch that implements this; it might be a bit dirty but it 
seems to work fine.  It does introduce an additional access() call per 
request; I don't really see that as a problem but maybe someone else 
does.  (This patch is against the debian package source of 2.2.3; again, 
not sure if that's OK)

--- mod_vhost_alias.c   2008-09-28 17:06:52.000000000 -0700
+++ mod_vhost_alias_mine.c      2008-09-28 17:02:51.000000000 -0700
@@ -37,7 +37,7 @@
  #include "apr_strings.h"
  #include "apr_hooks.h"
  #include "apr_lib.h"
-
+#include <unistd.h>
  #define APR_WANT_STRFUNC
  #include "apr_want.h"

@@ -250,7 +250,7 @@
      }
  }

-static void vhost_alias_interpolate(request_rec *r, const char *name,
+static int vhost_alias_interpolate(request_rec *r, const char *name,
                                      const char *map, const char *uri)
  {
      /* 0..9 9..0 */
@@ -372,12 +372,19 @@
          ++uri;
      }

+    /* Check accessibility of transformed directory path */
+    if(access(buf, R_OK)) {
+        return 0;
+    }
+
      if (r->filename) {
          r->filename = apr_pstrcat(r->pool, r->filename, buf, uri, NULL);
      }
      else {
          r->filename = apr_pstrcat(r->pool, buf, uri, NULL);
      }
+
+    return 1;
  }

  static int mva_translate(request_rec *r)
@@ -426,7 +433,8 @@
       * canonical_path buffer.
       */
      r->canonical_filename = "";
-    vhost_alias_interpolate(r, name, map, uri);
+    if(!vhost_alias_interpolate(r, name, map, uri))
+       return DECLINED;

      if (cgi) {
          /* see is_scriptaliased() in mod_cgi */