On 05/25/2006 07:56 AM, Ruediger Pluem wrote:
> During my analysis of PR39643 
> (http://issues.apache.org/bugzilla/show_bug.cgi?id=39643)
> I found out that mod_cache and mod_filter do not work together correctly. In 
> fact mod_filter
> crashes with a segfault if the content is delivered from the cache.
> 
> The segfault is caused by line 366 of mod_filter (filter_harness):
> 
>  if (!ctx->func) {
> 
> filter_harness implements the output filter of mod_filter.
> It expects that its context has been initialized and does not perform a check 
> if this is true.
> 
> Why is the context not initialized, if we deliver content from the cache?
> 
> This is because the filters (and thus the contexts of at least some filters) 
> get initialized
> in ap_invoke_filter_init which is a static function in config.c. 
> ap_invoke_filter_init gets
> only called by ap_invoke_handler (also in config.c). But if we deliver 
> content from the cache we
> do this inside the quick handler hook, which is run *before* 
> ap_invoke_handler. Although we call
> ap_run_insert_filter in the mod_cache quick handler we do *not* initialize 
> the filters there.
> 
> So basicly I see the following approach for a fix:
> 
> 1. In mod_filter do a sanity check if the filter context has been 
> initialized. If not remove ourselves
>    from the chain and simply pass the brigade. This could be done by the 
> following simple patch:
> 
> --- mod_filter.c        (Revision 408729)
> +++ mod_filter.c        (Arbeitskopie)
> @@ -355,7 +355,7 @@
>      harness_ctx *ctx = f->ctx;
>      ap_filter_rec_t *filter = f->frec;
> 
> -    if (f->r->status != 200) {
> +    if ((!ctx) || (f->r->status != 200)) {
>          ap_remove_output_filter(f);
>          return ap_pass_brigade(f->next, bb);
>      }
> 
>    Or does somebody sees a need for an error message here if the context is 
> not initialized?
> 
> 2. Convert ap_invoke_filter_init from a static function to a public function 
> that is part of the API
>    and let mod_cache call it after ap_run_insert_filter.
>    Questions:
> 
>    1. What kind of DECLARE macro should be used to convert it to a public 
> function ?
>    2. To which header file should we add the prototype?
>    3. Any special steps needed to adjust exports.c or is this done 
> automatically during
>       make / configure?
>    4. Does this require a minor bump (I assume yes)?
> 
> Comments / Thoughts / Answers ?

Ping. Any further comments? Especially any answers to my questions?
With answers to my questions I would be able to prepare a patch for further 
discussion :-).

Regards

RĂ¼diger

Reply via email to