You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@httpd.apache.org by Paul Querna <ch...@force-elite.com> on 2006/06/03 00:51:04 UTC

Re: svn commit: r231167 - /httpd/httpd/trunk/modules/generators/mod_cgi.c

(10 months after the commit...)
jerenkrantz@apache.org wrote:
> Author: jerenkrantz
> Date: Tue Aug  9 21:32:13 2005
> New Revision: 231167
> 
> URL: http://svn.apache.org/viewcvs?rev=231167&view=rev
> Log:
> Fix bug where non-200 CGI responses will not send anything down filter chain.
> This is most notable when mod_cache is used.  This has been used in production
> on wiki.apache.org for a while now.
> 
> * modules/generators/mod_cgi.c
>   (cgi_handler): When a non-zero value is returned by scan_script, set the
>   status field and ensure that we have an EOS to send down the filer stack.


This change is causing a regression in mod_cgi, when the CGI is invalid,
it causes no ISE to be sent downstream, and a zero byte reply is sent to
the client instead:

http://issues.apache.org/bugzilla/show_bug.cgi?id=39710

mod_cgid does not replicate this EOS sending that mod_cgi has.  Was this
an oversight?  It has nearly the same code paths.


> 
> Modified:
>     httpd/httpd/trunk/modules/generators/mod_cgi.c
> 
> Modified: httpd/httpd/trunk/modules/generators/mod_cgi.c
> URL: http://svn.apache.org/viewcvs/httpd/httpd/trunk/modules/generators/mod_cgi.c?rev=231167&r1=231166&r2=231167&view=diff
> ==============================================================================
> --- httpd/httpd/trunk/modules/generators/mod_cgi.c (original)
> +++ httpd/httpd/trunk/modules/generators/mod_cgi.c Tue Aug  9 21:32:13 2005
> @@ -929,7 +929,18 @@
>          int ret;
>  
>          if ((ret = ap_scan_script_header_err_brigade(r, bb, sbuf))) {
> -            return log_script(r, conf, ret, dbuf, sbuf, bb, script_err);
> +            ret = log_script(r, conf, ret, dbuf, sbuf, bb, script_err);
> +
> +            /* Set our status. */
> +            r->status = ret;
> +
> +            /* Pass EOS bucket down the filter chain. */
> +            apr_brigade_cleanup(bb);
> +            b = apr_bucket_eos_create(c->bucket_alloc);
> +            APR_BRIGADE_INSERT_TAIL(bb, b);
> +            ap_pass_brigade(r->output_filters, bb);
> +
> +            return ret;
>          }
>  
>          location = apr_table_get(r->headers_out, "Location");
> 

Setting r->status here seems really wrong. If a script has a "Status:"
header, it is already handled inside ap_scan_script_header_err_core.
Infact, I don't see how adding a EOS here really fixes the problem -- if
you just returned ret like normal, the core should generate the ISE
output for you, and mod_cache should still cache it, if it is added to
the error filter chain....

-Paul