Author: gozer
Date: Sun Dec 30 22:48:57 2007
New Revision: 607687

URL: http://svn.apache.org/viewvc?rev=607687&view=rev
Log:
Fix a crash when running a sub-request from within a filter where 
mod_perl was not the content handler.

Running modperl_wbucket_flush(rcfg->wbucket) before the subrequest
is run ensures we've flushed our own content handler if it has
any data in the pipeline. Problem was rcfg->wbucket will not be
set if we are not the content handler.

Solution is to avoid the flush in that particular case.


Added:
    perl/modperl/trunk/t/filter/TestFilter/with_subrequest.pm
    perl/modperl/trunk/t/filter/with_subrequest.t
Modified:
    perl/modperl/trunk/Changes
    perl/modperl/trunk/xs/Apache2/SubRequest/Apache2__SubRequest.h

Modified: perl/modperl/trunk/Changes
URL: 
http://svn.apache.org/viewvc/perl/modperl/trunk/Changes?rev=607687&r1=607686&r2=607687&view=diff
==============================================================================
--- perl/modperl/trunk/Changes (original)
+++ perl/modperl/trunk/Changes Sun Dec 30 22:48:57 2007
@@ -12,6 +12,9 @@
 
 =item 2.0.4-dev
 
+Fix a crash when running a sub-request from within a filter where
+mod_perl was not the content handler. [Gozer]
+
 Refactor tests to use keepalives instead of same_interp [Gozer, Phred]
 
 Apache2::Reload has been moved to an externally maintained

Added: perl/modperl/trunk/t/filter/TestFilter/with_subrequest.pm
URL: 
http://svn.apache.org/viewvc/perl/modperl/trunk/t/filter/TestFilter/with_subrequest.pm?rev=607687&view=auto
==============================================================================
--- perl/modperl/trunk/t/filter/TestFilter/with_subrequest.pm (added)
+++ perl/modperl/trunk/t/filter/TestFilter/with_subrequest.pm Sun Dec 30 
22:48:57 2007
@@ -0,0 +1,38 @@
+package TestFilter::with_subrequest;
+
+use strict;
+use warnings FATAL => 'all';
+
+use Apache2::Filter ();
+use Apache2::SubRequest ();
+
+use TestCommon::Utils;
+
+use Apache2::Const -compile => 'OK';
+
+sub handler {
+    my $f = shift;
+    my $r = $f->r;
+
+    my $subr;
+    while ($f->read(my $buffer, 1024)) {
+        $f->print(lc $buffer);
+       if (!$subr) {
+            $subr = $r->lookup_uri($r->uri);
+            my $rc = $subr->run;
+        }
+    }
+
+    Apache2::Const::OK;
+}
+
+1;
+__DATA__
+
+<Location /with_subrequest>
+  PerlOutputFilterHandler TestFilter::with_subrequest
+</Location>
+
+<IfModule mod_alias.c>
+    Alias /with_subrequest @top_dir@
+</IfModule>

Added: perl/modperl/trunk/t/filter/with_subrequest.t
URL: 
http://svn.apache.org/viewvc/perl/modperl/trunk/t/filter/with_subrequest.t?rev=607687&view=auto
==============================================================================
--- perl/modperl/trunk/t/filter/with_subrequest.t (added)
+++ perl/modperl/trunk/t/filter/with_subrequest.t Sun Dec 30 22:48:57 2007
@@ -0,0 +1,13 @@
+use strict;
+use warnings FATAL => 'all';
+
+use Apache::Test;
+use Apache::TestRequest;
+
+plan tests => 1, need 'mod_alias';
+
+my $location = "/with_subrequest/Makefile";
+
+my $str = GET_BODY $location;
+
+ok $str !~ /[A-Z]/;

Modified: perl/modperl/trunk/xs/Apache2/SubRequest/Apache2__SubRequest.h
URL: 
http://svn.apache.org/viewvc/perl/modperl/trunk/xs/Apache2/SubRequest/Apache2__SubRequest.h?rev=607687&r1=607686&r2=607687&view=diff
==============================================================================
--- perl/modperl/trunk/xs/Apache2/SubRequest/Apache2__SubRequest.h (original)
+++ perl/modperl/trunk/xs/Apache2/SubRequest/Apache2__SubRequest.h Sun Dec 30 
22:48:57 2007
@@ -23,8 +23,10 @@
 
     if (r->main) {
         modperl_config_req_t *rcfg = modperl_config_req_get(r->main);
-        MP_RUN_CROAK(modperl_wbucket_flush(rcfg->wbucket, FALSE),
-                     "Apache2::SubRequest::run");
+        if (rcfg->wbucket) {
+            MP_RUN_CROAK(modperl_wbucket_flush(rcfg->wbucket, FALSE),
+                         "Apache2::SubRequest::run");
+        }
     }
 
     return ap_run_sub_req(r);


Reply via email to