You are viewing a plain text version of this content. The canonical link for it is here.
Posted to cvs@httpd.apache.org by mi...@apache.org on 2010/09/04 16:42:30 UTC
svn commit: r992614 - in /httpd/httpd/trunk: CHANGES
modules/cache/cache_storage.c modules/cache/mod_cache.c
modules/cache/mod_cache.h
Author: minfrin
Date: Sat Sep 4 14:42:30 2010
New Revision: 992614
URL: http://svn.apache.org/viewvc?rev=992614&view=rev
Log:
mod_cache: Use a proper filter context to hold filter data instead
of misusing the per-request configuration. Fixes a segfault on trunk
when the normal handler is used.
Modified:
httpd/httpd/trunk/CHANGES
httpd/httpd/trunk/modules/cache/cache_storage.c
httpd/httpd/trunk/modules/cache/mod_cache.c
httpd/httpd/trunk/modules/cache/mod_cache.h
Modified: httpd/httpd/trunk/CHANGES
URL: http://svn.apache.org/viewvc/httpd/httpd/trunk/CHANGES?rev=992614&r1=992613&r2=992614&view=diff
==============================================================================
--- httpd/httpd/trunk/CHANGES [utf-8] (original)
+++ httpd/httpd/trunk/CHANGES [utf-8] Sat Sep 4 14:42:30 2010
@@ -2,6 +2,10 @@
Changes with Apache 2.3.9
+ *) mod_cache: Use a proper filter context to hold filter data instead
+ of misusing the per-request configuration. Fixes a segfault on trunk
+ when the normal handler is used. [Graham Leggett]
+
*) mod_cgid: Log a warning if the ScriptSock path is truncated because
it is too long. PR 49388. [Stefan Fritsch]
Modified: httpd/httpd/trunk/modules/cache/cache_storage.c
URL: http://svn.apache.org/viewvc/httpd/httpd/trunk/modules/cache/cache_storage.c?rev=992614&r1=992613&r2=992614&view=diff
==============================================================================
--- httpd/httpd/trunk/modules/cache/cache_storage.c (original)
+++ httpd/httpd/trunk/modules/cache/cache_storage.c Sat Sep 4 14:42:30 2010
@@ -72,8 +72,11 @@ int cache_create_entity(request_rec *r,
cache_handle_t *h = apr_pcalloc(r->pool, sizeof(cache_handle_t));
char *key;
apr_status_t rv;
- cache_request_rec *cache = (cache_request_rec *)
- ap_get_module_config(r->request_config, &cache_module);
+ cache_request_rec *cache;
+ void *data;
+
+ apr_pool_userdata_get(&data, MOD_CACHE_REQUEST_REC, r->pool);
+ cache = data;
rv = cache_generate_key(r, r->pool, &key);
if (rv != APR_SUCCESS) {
@@ -108,6 +111,10 @@ static int set_cookie_doo_doo(void *v, c
return 1;
}
+/**
+ * Take headers from the cache, and overlap them over the existing response
+ * headers.
+ */
CACHE_DECLARE(void) ap_cache_accept_headers(cache_handle_t *h, request_rec *r,
int preserve_orig)
{
@@ -186,8 +193,11 @@ int cache_select(request_rec *r)
apr_status_t rv;
cache_handle_t *h;
char *key;
- cache_request_rec *cache = (cache_request_rec *)
- ap_get_module_config(r->request_config, &cache_module);
+ cache_request_rec *cache;
+ void *data;
+
+ apr_pool_userdata_get(&data, MOD_CACHE_REQUEST_REC, r->pool);
+ cache = data;
rv = cache_generate_key(r, r->pool, &key);
if (rv != APR_SUCCESS) {
@@ -358,9 +368,10 @@ apr_status_t cache_generate_key_default(
const char *hostname, *scheme;
int i;
char *path, *querystring;
+ void *data;
- cache = (cache_request_rec *) ap_get_module_config(r->request_config,
- &cache_module);
+ apr_pool_userdata_get(&data, MOD_CACHE_REQUEST_REC, r->pool);
+ cache = data;
if (!cache) {
/* This should never happen */
ap_log_error(APLOG_MARK, APLOG_ERR, 0, r->server,
Modified: httpd/httpd/trunk/modules/cache/mod_cache.c
URL: http://svn.apache.org/viewvc/httpd/httpd/trunk/modules/cache/mod_cache.c?rev=992614&r1=992613&r2=992614&view=diff
==============================================================================
--- httpd/httpd/trunk/modules/cache/mod_cache.c (original)
+++ httpd/httpd/trunk/modules/cache/mod_cache.c Sat Sep 4 14:42:30 2010
@@ -92,13 +92,11 @@ static int cache_quick_handler(request_r
}
/* make space for the per request config */
- cache = (cache_request_rec *) ap_get_module_config(r->request_config,
- &cache_module);
- if (!cache) {
- cache = apr_pcalloc(r->pool, sizeof(cache_request_rec));
- cache->size = -1;
- ap_set_module_config(r->request_config, &cache_module, cache);
- }
+ cache = apr_pcalloc(r->pool, sizeof(cache_request_rec));
+ cache->size = -1;
+
+ /* store away the per request config where the API can find it */
+ apr_pool_userdata_setn(cache, MOD_CACHE_REQUEST_REC, NULL, r->pool);
/* save away the possible providers */
cache->providers = providers;
@@ -153,14 +151,14 @@ static int cache_quick_handler(request_r
"Adding CACHE_SAVE_SUBREQ filter for %s",
r->uri);
ap_add_output_filter_handle(cache_save_subreq_filter_handle,
- NULL, r, r->connection);
+ cache, r, r->connection);
}
else {
ap_log_error(APLOG_MARK, APLOG_DEBUG, APR_SUCCESS,
r->server, "Adding CACHE_SAVE filter for %s",
r->uri);
ap_add_output_filter_handle(cache_save_filter_handle,
- NULL, r, r->connection);
+ cache, r, r->connection);
}
ap_log_error(APLOG_MARK, APLOG_DEBUG, APR_SUCCESS, r->server,
@@ -191,9 +189,6 @@ static int cache_quick_handler(request_r
r->headers_in = cache->stale_headers;
}
-
- /* Delete our per-request configuration. */
- ap_set_module_config(r->request_config, &cache_module, NULL);
}
}
else {
@@ -213,9 +208,6 @@ static int cache_quick_handler(request_r
"Restoring request headers.");
r->headers_in = cache->stale_headers;
}
-
- /* Delete our per-request configuration. */
- ap_set_module_config(r->request_config, &cache_module, NULL);
}
rv = ap_meets_conditions(r);
@@ -254,7 +246,7 @@ static int cache_quick_handler(request_r
else {
cache_out_handle = cache_out_filter_handle;
}
- ap_add_output_filter_handle(cache_out_handle, NULL, r, r->connection);
+ ap_add_output_filter_handle(cache_out_handle, cache, r, r->connection);
/*
* Remove all filters that are before the cache_out filter. This ensures
@@ -359,12 +351,11 @@ static int cache_handler(request_rec *r)
}
/* make space for the per request config */
- cache = (cache_request_rec *) ap_get_module_config(r->request_config,
- &cache_module);
- if (!cache) {
- cache = apr_pcalloc(r->pool, sizeof(cache_request_rec));
- ap_set_module_config(r->request_config, &cache_module, cache);
- }
+ cache = apr_pcalloc(r->pool, sizeof(cache_request_rec));
+ cache->size = -1;
+
+ /* store away the per request config where the API can find it */
+ apr_pool_userdata_setn(cache, MOD_CACHE_REQUEST_REC, NULL, r->pool);
/* save away the possible providers */
cache->providers = providers;
@@ -412,7 +403,7 @@ static int cache_handler(request_rec *r)
cache_save_handle = cache_save_filter_handle;
}
ap_add_output_filter_handle(cache_save_handle,
- NULL, r, r->connection);
+ cache, r, r->connection);
/*
* Did the user indicate the precise location of the
@@ -481,7 +472,7 @@ static int cache_handler(request_rec *r)
else {
cache_out_handle = cache_out_filter_handle;
}
- ap_add_output_filter_handle(cache_out_handle, NULL, r, r->connection);
+ ap_add_output_filter_handle(cache_out_handle, cache, r, r->connection);
/*
* Did the user indicate the precise location of the CACHE_OUT filter by
@@ -542,16 +533,13 @@ static int cache_handler(request_rec *r)
static int cache_out_filter(ap_filter_t *f, apr_bucket_brigade *bb)
{
request_rec *r = f->r;
- cache_request_rec *cache;
-
- cache = (cache_request_rec *) ap_get_module_config(r->request_config,
- &cache_module);
+ cache_request_rec *cache = (cache_request_rec *)f->ctx;
if (!cache) {
/* user likely configured CACHE_OUT manually; they should use mod_cache
* configuration to do that */
ap_log_error(APLOG_MARK, APLOG_ERR, 0, r->server,
- "CACHE_OUT enabled unexpectedly");
+ "CACHE/CACHE_OUT filter enabled while caching is disabled, ignoring");
ap_remove_output_filter(f);
return ap_pass_brigade(f->next, bb);
}
@@ -599,7 +587,7 @@ static int cache_save_filter(ap_filter_t
{
int rv = !OK;
request_rec *r = f->r;
- cache_request_rec *cache;
+ cache_request_rec *cache = (cache_request_rec *)f->ctx;
cache_server_conf *conf;
const char *cc_out, *cl;
const char *exps, *lastmods, *dates, *etag;
@@ -609,20 +597,20 @@ static int cache_save_filter(ap_filter_t
char *reason;
apr_pool_t *p;
apr_bucket *e;
+ void *data;
conf = (cache_server_conf *) ap_get_module_config(r->server->module_config,
&cache_module);
/* Setup cache_request_rec */
- cache = (cache_request_rec *) ap_get_module_config(r->request_config,
- &cache_module);
if (!cache) {
/* user likely configured CACHE_SAVE manually; they should really use
* mod_cache configuration to do that
*/
- cache = apr_pcalloc(r->pool, sizeof(cache_request_rec));
- ap_set_module_config(r->request_config, &cache_module, cache);
- cache->size = -1;
+ ap_log_error(APLOG_MARK, APLOG_ERR, 0, r->server,
+ "CACHE/CACHE_SAVE filter enabled while caching is disabled, ignoring");
+ ap_remove_output_filter(f);
+ return ap_pass_brigade(f->next, in);
}
reason = NULL;
Modified: httpd/httpd/trunk/modules/cache/mod_cache.h
URL: http://svn.apache.org/viewvc/httpd/httpd/trunk/modules/cache/mod_cache.h?rev=992614&r1=992613&r2=992614&view=diff
==============================================================================
--- httpd/httpd/trunk/modules/cache/mod_cache.h (original)
+++ httpd/httpd/trunk/modules/cache/mod_cache.h Sat Sep 4 14:42:30 2010
@@ -374,10 +374,13 @@ CACHE_DECLARE(apr_table_t *)ap_cache_cac
/**
* cache_storage.c
*/
+#define MOD_CACHE_REQUEST_REC "mod_cache_request_rec"
int cache_remove_url(cache_request_rec *cache, apr_pool_t *p);
int cache_create_entity(request_rec *r, apr_off_t size);
int cache_select(request_rec *r);
apr_status_t cache_generate_key_default( request_rec *r, apr_pool_t*p, char**key );
+
+
/**
* create a key for the cache based on the request record
* this is the 'default' version, which can be overridden by a default function