From: Jim Jagielski Date: Wed, 5 Mar 2008 15:44:44 +0000 (+0000) Subject: Merge r632730, r633791 from trunk: X-Git-Tag: 2.2.9~328 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=eb663510ed0ff04f19a6d18bcfff18789bc220ba;p=thirdparty%2Fapache%2Fhttpd.git Merge r632730, r633791 from trunk: mod_rewrite: Check all files used by DBM maps for freshness, mod_rewrite didn't pick up on updated sdbm maps due to this. PR41190 [Niklas Edmundsson] NOTE: Only tested on httpd-2.2.8. * Add checkfile2 at the end of the struct and not in the middle of the struct. Reviewed by: jim git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/branches/2.2.x@633885 13f79535-47bb-0310-9956-ffa450edef68 --- diff --git a/CHANGES b/CHANGES index 74418d2447c..205562c2a49 100644 --- a/CHANGES +++ b/CHANGES @@ -1,6 +1,10 @@ -*- coding: utf-8 -*- Changes with Apache 2.2.9 + *) mod_rewrite: Check all files used by DBM maps for freshness, mod_rewrite + didn't pick up on updated sdbm maps due to this. + PR41190 [Niklas Edmundsson] + *) Don't add bogus duplicate Content-Language entries PR 11035 [Davi Arnaut] diff --git a/STATUS b/STATUS index 3202d20f423..8aa206174c5 100644 --- a/STATUS +++ b/STATUS @@ -81,13 +81,6 @@ RELEASE SHOWSTOPPERS: PATCHES ACCEPTED TO BACKPORT FROM TRUNK: [ start all new proposals below, under PATCHES PROPOSED. ] - * mod_rewrite: Stat all files for DBM maps (PR41190) - Trunk version of patch: - http://svn.apache.org/viewvc?rev=632730&view=rev - http://svn.apache.org/viewvc?rev=633791&view=rev - Backport version for 2.2.x of patch: - Trunk version of patch should work (modulo CHANGES). - +1: nikke, rpluem, jim PATCHES PROPOSED TO BACKPORT FROM TRUNK: [ New proposals should be added at the end of the list ] diff --git a/modules/mappers/mod_rewrite.c b/modules/mappers/mod_rewrite.c index b3f8bdc75a7..ed2f5323e94 100644 --- a/modules/mappers/mod_rewrite.c +++ b/modules/mappers/mod_rewrite.c @@ -227,6 +227,8 @@ typedef struct { char *(*func)(request_rec *, /* function pointer for internal maps */ char *); char **argv; /* argv of the external rewrite map */ + const char *checkfile2; /* filename to check for map existence + NULL if only one file */ } rewritemap_entry; /* special pattern types for RewriteCond */ @@ -1551,6 +1553,21 @@ static char *lookup_map(request_rec *r, char *name, char *key) ap_log_rerror(APLOG_MARK, APLOG_ERR, rv, r, "mod_rewrite: can't access DBM RewriteMap file %s", s->checkfile); + } + else if(s->checkfile2 != NULL) { + apr_finfo_t st2; + + rv = apr_stat(&st2, s->checkfile2, APR_FINFO_MIN, r->pool); + if (rv != APR_SUCCESS) { + ap_log_rerror(APLOG_MARK, APLOG_ERR, rv, r, + "mod_rewrite: can't access DBM RewriteMap " + "file %s", s->checkfile2); + } + else if(st2.mtime > st.mtime) { + st.mtime = st2.mtime; + } + } + if(rv != APR_SUCCESS) { rewritelog((r, 1, NULL, "can't open DBM RewriteMap file, see error log")); return NULL; @@ -2822,6 +2839,7 @@ static const char *cmd_rewritemap(cmd_parms *cmd, void *dconf, const char *a1, newmap->type = MAPTYPE_TXT; newmap->datafile = fname; newmap->checkfile = fname; + newmap->checkfile2= NULL; newmap->cachename = apr_psprintf(cmd->pool, "%pp:%s", (void *)cmd->server, a1); } @@ -2834,11 +2852,11 @@ static const char *cmd_rewritemap(cmd_parms *cmd, void *dconf, const char *a1, newmap->type = MAPTYPE_RND; newmap->datafile = fname; newmap->checkfile = fname; + newmap->checkfile2= NULL; newmap->cachename = apr_psprintf(cmd->pool, "%pp:%s", (void *)cmd->server, a1); } else if (strncasecmp(a2, "dbm", 3) == 0) { - const char *ignored_fname; apr_status_t rv; newmap->type = MAPTYPE_DBM; @@ -2873,7 +2891,7 @@ static const char *cmd_rewritemap(cmd_parms *cmd, void *dconf, const char *a1, rv = apr_dbm_get_usednames_ex(cmd->pool, newmap->dbmtype, newmap->datafile, &newmap->checkfile, - &ignored_fname); + &newmap->checkfile2); if (rv != APR_SUCCESS) { return apr_pstrcat(cmd->pool, "RewriteMap: dbm type ", newmap->dbmtype, " is invalid", NULL); @@ -2892,12 +2910,14 @@ 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->checkfile2= NULL; newmap->cachename = NULL; } else if (strncasecmp(a2, "int:", 4) == 0) { newmap->type = MAPTYPE_INT; newmap->datafile = NULL; newmap->checkfile = NULL; + newmap->checkfile2= NULL; newmap->cachename = NULL; newmap->func = (char *(*)(request_rec *,char *)) apr_hash_get(mapfunc_hash, a2+4, strlen(a2+4)); @@ -2915,6 +2935,7 @@ static const char *cmd_rewritemap(cmd_parms *cmd, void *dconf, const char *a1, newmap->type = MAPTYPE_TXT; newmap->datafile = fname; newmap->checkfile = fname; + newmap->checkfile2= NULL; newmap->cachename = apr_psprintf(cmd->pool, "%pp:%s", (void *)cmd->server, a1); }