From 23f1aab304d3e7c8c9fb79ce35102da78541c84d Mon Sep 17 00:00:00 2001 From: =?utf8?q?Andr=C3=A9=20Malo?= Date: Fri, 20 Aug 2004 21:17:41 +0000 Subject: [PATCH] Fix confused map cache (with maps in different VHs using 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 | 4 ++++ STATUS | 9 +-------- modules/mappers/mod_rewrite.c | 28 +++++++++++++++++++--------- modules/mappers/mod_rewrite.h | 7 ++++--- 4 files changed, 28 insertions(+), 20 deletions(-) diff --git a/CHANGES b/CHANGES index cd167264075..d592b7d53a8 100644 --- 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 1c77d9ef799..b341c58184c 100644 --- 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): - - 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 diff --git a/modules/mappers/mod_rewrite.c b/modules/mappers/mod_rewrite.c index 9c762722fe6..b2ef7871372 100644 --- a/modules/mappers/mod_rewrite.c +++ b/modules/mappers/mod_rewrite.c @@ -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; } diff --git a/modules/mappers/mod_rewrite.h b/modules/mappers/mod_rewrite.h index 8042c193cd8..b6320175460 100644 --- a/modules/mappers/mod_rewrite.h +++ b/modules/mappers/mod_rewrite.h @@ -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 { -- 2.47.2