From: André Malo Date: Fri, 20 Aug 2004 21:22:25 +0000 (+0000) Subject: Fix confused map cache (with maps in different VHs using X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=e44e8548f6c0994c56df49ff5ee6c88f0070a45c;p=thirdparty%2Fapache%2Fhttpd.git 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/1.3.x@104760 13f79535-47bb-0310-9956-ffa450edef68 --- diff --git a/src/CHANGES b/src/CHANGES index 8746b361265..8421cf5f9ac 100644 --- a/src/CHANGES +++ b/src/CHANGES @@ -1,5 +1,9 @@ Changes with Apache 1.3.32 + *) 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/src/modules/standard/mod_rewrite.c b/src/modules/standard/mod_rewrite.c index 86f7d90a880..84779370e02 100644 --- a/src/modules/standard/mod_rewrite.c +++ b/src/modules/standard/mod_rewrite.c @@ -449,17 +449,23 @@ static const char *cmd_rewritemap(cmd_parms *cmd, void *dconf, char *a1, new->type = MAPTYPE_TXT; new->datafile = a2+4; new->checkfile = a2+4; + new->cachename = ap_psprintf(cmd->pool, "%pp:%s", + (void *)cmd->server, a1); } else if (strncmp(a2, "rnd:", 4) == 0) { new->type = MAPTYPE_RND; new->datafile = a2+4; new->checkfile = a2+4; + new->cachename = ap_psprintf(cmd->pool, "%pp:%s", + (void *)cmd->server, a1); } else if (strncmp(a2, "dbm:", 4) == 0) { #ifndef NO_DBM_REWRITEMAP new->type = MAPTYPE_DBM; new->datafile = a2+4; new->checkfile = ap_pstrcat(cmd->pool, a2+4, NDBM_FILE_SUFFIX, NULL); + new->cachename = ap_psprintf(cmd->pool, "%pp:%s", + (void *)cmd->server, a1); #else return ap_pstrdup(cmd->pool, "RewriteMap: cannot use NDBM mapfile, " "because no NDBM support is compiled in"); @@ -469,11 +475,13 @@ static const char *cmd_rewritemap(cmd_parms *cmd, void *dconf, char *a1, new->type = MAPTYPE_PRG; new->datafile = a2+4; new->checkfile = a2+4; + new->cachename = NULL; } else if (strncmp(a2, "int:", 4) == 0) { new->type = MAPTYPE_INT; new->datafile = NULL; new->checkfile = NULL; + new->cachename = NULL; if (strcmp(a2+4, "tolower") == 0) { new->func = rewrite_mapfunc_tolower; } @@ -495,6 +503,8 @@ static const char *cmd_rewritemap(cmd_parms *cmd, void *dconf, char *a1, new->type = MAPTYPE_TXT; new->datafile = a2; new->checkfile = a2; + new->cachename = ap_psprintf(cmd->pool, "%pp:%s", + (void *)cmd->server, a1); } new->fpin = -1; new->fpout = -1; @@ -2837,7 +2847,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.st_mtime, key); if (value == NULL) { rewritelog(r, 6, "cache lookup FAILED, forcing new " @@ -2846,14 +2856,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.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.st_mtime, key, ""); return NULL; } @@ -2874,7 +2884,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.st_mtime, key); if (value == NULL) { rewritelog(r, 6, @@ -2883,14 +2893,14 @@ static char *lookup_map(request_rec *r, char *name, char *key) lookup_map_dbmfile(r, s->datafile, 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.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.st_mtime, key, ""); return NULL; } @@ -2936,7 +2946,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.st_mtime, key); if (value == NULL) { rewritelog(r, 6, "cache lookup FAILED, forcing new " @@ -2945,13 +2955,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.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.st_mtime, key, ""); return NULL; } diff --git a/src/modules/standard/mod_rewrite.h b/src/modules/standard/mod_rewrite.h index c36595b2c7a..f225cea5773 100644 --- a/src/modules/standard/mod_rewrite.h +++ b/src/modules/standard/mod_rewrite.h @@ -232,6 +232,7 @@ typedef struct { int fperr; /* err file pointer for program maps */ char *(*func)(request_rec *, /* function pointer for internal maps */ char *); + char *cachename; /* name for the cache */ } rewritemap_entry; typedef struct {