]> granicus.if.org Git - apache/commitdiff
fix cache confusion which happens if different virtualhosts define
authorAndré Malo <nd@apache.org>
Sat, 10 Apr 2004 20:23:51 +0000 (20:23 +0000)
committerAndré Malo <nd@apache.org>
Sat, 10 Apr 2004 20:23:51 +0000 (20:23 +0000)
rewritemaps with the same name.
This is done using name mangling. For the cache we prefix the map name
with the hex value of the current server struct pointer. This way
inherited maps still use the same cache.

PR: 26462

git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@103335 13f79535-47bb-0310-9956-ffa450edef68

CHANGES
modules/mappers/mod_rewrite.c

diff --git a/CHANGES b/CHANGES
index 6c27ddf646bb1cfde6ecc5188e18501f0335dfd2..782f07eb43ad7f5b23aa4ffc1a63ad17de0c2874 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -2,6 +2,10 @@ Changes with Apache 2.1.0-dev
 
   [Remove entries to the current 2.0 section below, when backported]
 
+  *) mod_rewrite no longer confuses the RewriteMap caches if
+     different maps defined in different virtual hosts use the
+     same map name. PR 26462.  [André Malo]
+
   *) mod_log_config now logs all Set-Cookie headers if the %{Set-Cookie}o
      format is used.  PR 27787.  [André Malo]
 
index d489246dd8c02dfe4e1adcf6616d470e58d61e0d..10391d2e2168ba255a349251d6d4b1a91468ecf8 100644 (file)
@@ -220,6 +220,7 @@ typedef struct {
     const char *datafile;          /* filename for map data files         */
     const char *dbmtype;           /* dbm type for dbm map data files     */
     const char *checkfile;         /* filename to check for map existence */
+    const char *cachename;         /* for cached maps (txt/rnd/dbm)       */
     int   type;                    /* the type of the map                 */
     apr_file_t *fpin;              /* in  file pointer for program maps   */
     apr_file_t *fpout;             /* out file pointer for program maps   */
@@ -1449,7 +1450,7 @@ static char *lookup_map(request_rec *r, char *name, char *key)
             return NULL;
         }
 
-        value = get_cache_value(name, st.mtime, key, r->pool);
+        value = get_cache_value(s->cachename, st.mtime, key, r->pool);
         if (!value) {
             rewritelog((r, 6, NULL,
                         "cache lookup FAILED, forcing new map lookup"));
@@ -1458,13 +1459,13 @@ static char *lookup_map(request_rec *r, char *name, char *key)
             if (!value) {
                 rewritelog((r, 5, NULL, "map lookup FAILED: map=%s[txt] key=%s",
                             name, key));
-                set_cache_value(name, st.mtime, key, "");
+                set_cache_value(s->cachename, st.mtime, key, "");
                 return NULL;
             }
 
             rewritelog((r, 5, NULL,"map lookup OK: map=%s[txt] key=%s -> val=%s",
                         name, key, value));
-            set_cache_value(name, st.mtime, key, value);
+            set_cache_value(s->cachename, st.mtime, key, value);
         }
         else {
             rewritelog((r,5,NULL,"cache lookup OK: map=%s[txt] key=%s -> val=%s",
@@ -1492,7 +1493,7 @@ static char *lookup_map(request_rec *r, char *name, char *key)
             return NULL;
         }
 
-        value = get_cache_value(name, st.mtime, key, r->pool);
+        value = get_cache_value(s->cachename, st.mtime, key, r->pool);
         if (!value) {
             rewritelog((r, 6, NULL,
                         "cache lookup FAILED, forcing new map lookup"));
@@ -1501,14 +1502,14 @@ static char *lookup_map(request_rec *r, char *name, char *key)
             if (!value) {
                 rewritelog((r, 5, NULL, "map lookup FAILED: map=%s[dbm] key=%s",
                             name, key));
-                set_cache_value(name, st.mtime, key, "");
+                set_cache_value(s->cachename, st.mtime, key, "");
                 return NULL;
             }
 
             rewritelog((r, 5, NULL, "map lookup OK: map=%s[dbm] key=%s -> "
                         "val=%s", name, key, value));
 
-            set_cache_value(name, st.mtime, key, value);
+            set_cache_value(s->cachename, st.mtime, key, value);
             return value;
         }
 
@@ -2759,6 +2760,8 @@ static const char *cmd_rewritemap(cmd_parms *cmd, void *dconf, const char *a1,
         newmap->type      = MAPTYPE_TXT;
         newmap->datafile  = fname;
         newmap->checkfile = fname;
+        newmap->cachename = apr_psprintf(cmd->pool, "%pp:%s",
+                                         (void *)cmd->server, a1);
     }
     else if (strncasecmp(a2, "rnd:", 4) == 0) {
         if ((fname = ap_server_root_relative(cmd->pool, a2+4)) == NULL) {
@@ -2769,6 +2772,8 @@ static const char *cmd_rewritemap(cmd_parms *cmd, void *dconf, const char *a1,
         newmap->type      = MAPTYPE_RND;
         newmap->datafile  = fname;
         newmap->checkfile = fname;
+        newmap->cachename = apr_psprintf(cmd->pool, "%pp:%s",
+                                         (void *)cmd->server, a1);
     }
     else if (strncasecmp(a2, "dbm", 3) == 0) {
         const char *ignored_fname;
@@ -2776,6 +2781,8 @@ static const char *cmd_rewritemap(cmd_parms *cmd, void *dconf, const char *a1,
 
         newmap->type = MAPTYPE_DBM;
         fname = NULL;
+        newmap->cachename = apr_psprintf(cmd->pool, "%pp:%s",
+                                         (void *)cmd->server, a1);
 
         if (a2[3] == ':') {
             newmap->dbmtype = "default";
@@ -2823,11 +2830,13 @@ static const char *cmd_rewritemap(cmd_parms *cmd, void *dconf, const char *a1,
         newmap->type      = MAPTYPE_PRG;
         newmap->datafile  = NULL;
         newmap->checkfile = newmap->argv[0];
+        newmap->cachename = NULL;
     }
     else if (strncasecmp(a2, "int:", 4) == 0) {
         newmap->type      = MAPTYPE_INT;
         newmap->datafile  = NULL;
         newmap->checkfile = NULL;
+        newmap->cachename = NULL;
         newmap->func      = (char *(*)(request_rec *,char *))
                             apr_hash_get(mapfunc_hash, a2+4, strlen(a2+4));
         if ((sconf->state == ENGINE_ENABLED) && (newmap->func == NULL)) {
@@ -2844,6 +2853,8 @@ static const char *cmd_rewritemap(cmd_parms *cmd, void *dconf, const char *a1,
         newmap->type      = MAPTYPE_TXT;
         newmap->datafile  = fname;
         newmap->checkfile = fname;
+        newmap->cachename = apr_psprintf(cmd->pool, "%pp:%s",
+                                         (void *)cmd->server, a1);
     }
     newmap->fpin  = NULL;
     newmap->fpout = NULL;