]> git.ipfire.org Git - thirdparty/apache/httpd.git/commitdiff
Fix confused map cache (with maps in different VHs using
authorAndré Malo <nd@apache.org>
Fri, 20 Aug 2004 21:17:41 +0000 (21:17 +0000)
committerAndré Malo <nd@apache.org>
Fri, 20 Aug 2004 21:17:41 +0000 (21:17 +0000)
the same name).

PR: 26462
Reviewed by: Jeff Trawick, Joe Orton

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

CHANGES
STATUS
modules/mappers/mod_rewrite.c
modules/mappers/mod_rewrite.h

diff --git a/CHANGES b/CHANGES
index cd167264075a50ed3fb95b72b25ebaae9a60bf6a..d592b7d53a87b5440d0ed546eda1bf8496c3f08f 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -1,5 +1,9 @@
 Changes with Apache 2.0.51
 
+  *) 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_setenvif: Remove "support" for Remote_User variable which
      never worked at all. PR 25725.  [André Malo]
 
diff --git a/STATUS b/STATUS
index 1c77d9ef799aa5899808620e6a9652c949e06d26..b341c58184cc5957be95988cdb72d91ab861e88e 100644 (file)
--- a/STATUS
+++ b/STATUS
@@ -1,5 +1,5 @@
 APACHE 2.0 STATUS:                                              -*-text-*-
-Last modified at [$Date: 2004/08/20 18:51:01 $]
+Last modified at [$Date: 2004/08/20 21:17:39 $]
 
 Release:
 
@@ -212,13 +212,6 @@ PATCHES TO BACKPORT FROM 2.1
          server/config.c: r1.175
        +1: nd
 
-    *) mod_rewrite: Fix confused map cache (with maps in different VHs using
-       the same name). PR 26462. (2.0 + 1.3)
-       A patch for 1.3 is here (2.0 goes similar):
-       <http://www.apache.org/~nd/mod_rewrite-confusion-1.3.patch>
-         modules/mappers/mod_rewrite.c: r1.256
-       +1: nd, trawick, 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 9c762722fe65b32f3625bf57550929676f19b810..b2ef7871372fe354f4d72a151ad36ea651a8be4e 100644 (file)
@@ -402,11 +402,15 @@ static const char *cmd_rewritemap(cmd_parms *cmd, void *dconf, const char *a1,
         newmap->type      = MAPTYPE_TXT;
         newmap->datafile  = a2+4;
         newmap->checkfile = a2+4;
+        newmap->cachename = apr_psprintf(cmd->pool, "%pp:%s",
+                                         (void *)cmd->server, a1);
     }
     else if (strncmp(a2, "rnd:", 4) == 0) {
         newmap->type      = MAPTYPE_RND;
         newmap->datafile  = a2+4;
         newmap->checkfile = a2+4;
+        newmap->cachename = apr_psprintf(cmd->pool, "%pp:%s",
+                                         (void *)cmd->server, a1);
     }
     else if (strncmp(a2, "dbm", 3) == 0) {
         const char *ignored_fname;
@@ -414,6 +418,8 @@ static const char *cmd_rewritemap(cmd_parms *cmd, void *dconf, const char *a1,
         apr_status_t rv;
 
         newmap->type = MAPTYPE_DBM;
+        newmap->cachename = apr_psprintf(cmd->pool, "%pp:%s",
+                                         (void *)cmd->server, a1);
 
         if (a2[3] == ':') {
             newmap->dbmtype    = "default";
@@ -453,12 +459,14 @@ static const char *cmd_rewritemap(cmd_parms *cmd, void *dconf, const char *a1,
         apr_tokenize_to_argv(a2 + 4, &newmap->argv, cmd->pool);
         newmap->datafile  = NULL;
         newmap->checkfile = newmap->argv[0];
+        newmap->cachename = NULL;
 
     }
     else if (strncmp(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)) {
@@ -470,6 +478,8 @@ static const char *cmd_rewritemap(cmd_parms *cmd, void *dconf, const char *a1,
         newmap->type      = MAPTYPE_TXT;
         newmap->datafile  = a2;
         newmap->checkfile = a2;
+        newmap->cachename = apr_psprintf(cmd->pool, "%pp:%s",
+                                         (void *)cmd->server, a1);
     }
     newmap->fpin  = NULL;
     newmap->fpout = NULL;
@@ -2965,7 +2975,7 @@ static char *lookup_map(request_rec *r, char *name, char *key)
                                "see error log");
                     return NULL;
                 }
-                value = get_cache_string(cachep, s->name, CACHEMODE_TS,
+                value = get_cache_string(cachep, s->cachename, CACHEMODE_TS,
                                          st.mtime, key);
                 if (value == NULL) {
                     rewritelog(r, 6, "cache lookup FAILED, forcing new "
@@ -2974,14 +2984,14 @@ static char *lookup_map(request_rec *r, char *name, char *key)
                          lookup_map_txtfile(r, s->datafile, key)) != NULL) {
                         rewritelog(r, 5, "map lookup OK: map=%s key=%s[txt] "
                                    "-> val=%s", s->name, key, value);
-                        set_cache_string(cachep, s->name, CACHEMODE_TS,
+                        set_cache_string(cachep, s->cachename, CACHEMODE_TS,
                                          st.mtime, key, value);
                         return value;
                     }
                     else {
                         rewritelog(r, 5, "map lookup FAILED: map=%s[txt] "
                                    "key=%s", s->name, key);
-                        set_cache_string(cachep, s->name, CACHEMODE_TS,
+                        set_cache_string(cachep, s->cachename, CACHEMODE_TS,
                                          st.mtime, key, "");
                         return NULL;
                     }
@@ -3002,7 +3012,7 @@ static char *lookup_map(request_rec *r, char *name, char *key)
                                "see error log");
                     return NULL;
                 }
-                value = get_cache_string(cachep, s->name, CACHEMODE_TS,
+                value = get_cache_string(cachep, s->cachename, CACHEMODE_TS,
                                          st.mtime, key);
                 if (value == NULL) {
                     rewritelog(r, 6,
@@ -3011,14 +3021,14 @@ static char *lookup_map(request_rec *r, char *name, char *key)
                          lookup_map_dbmfile(r, s->datafile, s->dbmtype, key)) != NULL) {
                         rewritelog(r, 5, "map lookup OK: map=%s[dbm] key=%s "
                                    "-> val=%s", s->name, key, value);
-                        set_cache_string(cachep, s->name, CACHEMODE_TS,
+                        set_cache_string(cachep, s->cachename, CACHEMODE_TS,
                                          st.mtime, key, value);
                         return value;
                     }
                     else {
                         rewritelog(r, 5, "map lookup FAILED: map=%s[dbm] "
                                    "key=%s", s->name, key);
-                        set_cache_string(cachep, s->name, CACHEMODE_TS,
+                        set_cache_string(cachep, s->cachename, CACHEMODE_TS,
                                          st.mtime, key, "");
                         return NULL;
                     }
@@ -3062,7 +3072,7 @@ static char *lookup_map(request_rec *r, char *name, char *key)
                                "see error log");
                     return NULL;
                 }
-                value = get_cache_string(cachep, s->name, CACHEMODE_TS,
+                value = get_cache_string(cachep, s->cachename, CACHEMODE_TS,
                                          st.mtime, key);
                 if (value == NULL) {
                     rewritelog(r, 6, "cache lookup FAILED, forcing new "
@@ -3071,13 +3081,13 @@ static char *lookup_map(request_rec *r, char *name, char *key)
                          lookup_map_txtfile(r, s->datafile, key)) != NULL) {
                         rewritelog(r, 5, "map lookup OK: map=%s key=%s[txt] "
                                    "-> val=%s", s->name, key, value);
-                        set_cache_string(cachep, s->name, CACHEMODE_TS,
+                        set_cache_string(cachep, s->cachename, CACHEMODE_TS,
                                          st.mtime, key, value);
                     }
                     else {
                         rewritelog(r, 5, "map lookup FAILED: map=%s[txt] "
                                    "key=%s", s->name, key);
-                        set_cache_string(cachep, s->name, CACHEMODE_TS,
+                        set_cache_string(cachep, s->cachename, CACHEMODE_TS,
                                          st.mtime, key, "");
                         return NULL;
                     }
index 8042c193cd8324bd43289c89b57a2443edfaecd6..b63201754606ceffb101a5ac277d84c177ebd3d9 100644 (file)
@@ -186,12 +186,13 @@ typedef struct {
     const char *dbmtype;           /* dbm type for dbm map data files */
     const char *checkfile;         /* filename to check for map existence */
     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 */
-    apr_file_t *fperr;              /* err file pointer for program maps */
+    apr_file_t *fpin;              /* in  file pointer for program maps */
+    apr_file_t *fpout;             /* out file pointer for program maps */
+    apr_file_t *fperr;             /* err file pointer for program maps */
     char *(*func)(request_rec *,   /* function pointer for internal maps */
                   char *);
     char **argv;
+    char *cachename;               /* name for the cache */
 } rewritemap_entry;
 
 typedef struct {