stas 2003/11/22 02:27:42
Modified: src/modules/perl modperl_io.c
. Changes
Added: t/modules include_subreq.t
t/response/TestModules include_subreq.pm
Log:
Fix :Apache perlio's STDOUT to be reentrant + modules/include_subreq
test
Revision Changes Path
1.20 +11 -2 modperl-2.0/src/modules/perl/modperl_io.c
Index: modperl_io.c
===================================================================
RCS file: /home/cvs/modperl-2.0/src/modules/perl/modperl_io.c,v
retrieving revision 1.19
retrieving revision 1.20
diff -u -u -r1.19 -r1.20
--- modperl_io.c 15 Oct 2003 00:37:59 -0000 1.19
+++ modperl_io.c 22 Nov 2003 10:27:41 -0000 1.20
@@ -190,9 +190,18 @@
MP_TRACE_o(MP_FUNC, "start");
- /* Perl_do_close(aTHX_ handle_orig, FALSE); */
-
+ /* since closing unflushed STDOUT may trigger a subrequest
+ * (e.g. via mod_include), resulting in potential another response
+ * handler call, which may try to close STDOUT too. We will
+ * segfault, if that subrequest doesn't return before the the top
+ * level STDOUT is attempted to be closed. To prevent this
+ * situation always explicitly flush STDOUT, before reopening it.
+ */
+ if (GvIOn(handle_orig) && IoOFP(GvIOn(handle_orig))) {
+ Perl_PerlIO_flush(aTHX_ IoOFP(GvIOn(handle_orig)));
+ }
/* open STDOUT, ">&STDOUT_SAVED" or die "Can't dup STDOUT_SAVED: $!"; */
+ /* open first closes STDOUT */
status = Perl_do_open9(aTHX_ handle_orig, ">&", 2, FALSE, O_WRONLY,
0, Nullfp, (SV*)handle, 1);
Perl_do_close(aTHX_ handle, FALSE);
1.1 modperl-2.0/t/modules/include_subreq.t
Index: include_subreq.t
===================================================================
use strict;
use warnings FATAL => 'all';
use Apache::Test;
use Apache::TestRequest;
use Apache::TestUtil;
my $module = 'TestModules::include_subreq';
my $location = '/' . Apache::TestRequest::module2path($module);
plan tests => 1, ['include'];
my($res, $str);
my $expected = "subreq is quite ok";
my $received = GET_BODY_ASSERT "$location/one";
ok t_cmp($expected, $received, "handler => filter => handler");
1.1 modperl-2.0/t/response/TestModules/include_subreq.pm
Index: include_subreq.pm
===================================================================
package TestModules::include_subreq;
# this test calls a simple response handler, whose output includes a
# simple SSI directive, processed by the INCLUDES output filter, which
# triggers another response handler, which again returns an SSI
# directive, again processed by INCLUDES, which again calls a response
# handler
#
# main
# resp => INCLUDES => => client
# => 1st =>
# subreq => INCLUDES => =>
# response => =>
# => 2nd =>
# subreq =>
# response
#
#
#
# here we test whether :Apache perlio (STDOUT) is reentrant, since the test
# overrides STDOUT 3 times, recursively.
use strict;
use warnings FATAL => 'all';
use Apache::TestTrace;
use Apache::Const -compile => 'OK';
sub handler {
my $r = shift;
$r->content_type('text/plain');
my $path_info = $r->path_info || '';
my $uri = $r->uri;
debug "uri: $uri, path_info: $path_info";
if ($path_info eq '/one') {
$uri =~ s/one/two/;
print qq[subreq <!--#include virtual="$uri" -->ok];
}
elsif ($path_info eq '/two') {
$uri = "/TestModules__include_subreq_dup/three";
#$uri =~ s/two/three/;
print qq[is <!--#include virtual="$uri" -->];
#print "is";
}
elsif ($path_info eq '/three') {
print "quite ";
}
else {
die "something is wrong, didn't get path_info";
}
Apache::OK;
}
1;
__END__
# notice that perl-script is used on purpose here - testing whether
# :Apache perlio is reentrant (SetHandler modperl doesn't go through
# :Apache perlio layer)
SetHandler perl-script
PerlSetOutputFilter INCLUDES
Options +IncludesNoExec
<Base>
# it's silly that we have to duplicate the resource, but mod_include
# otherwise thinks we have a recursive call loop
<Location /TestModules__include_subreq_dup>
PerlSetOutputFilter INCLUDES
Options +IncludesNoExec
SetHandler perl-script
PerlResponseHandler TestModules::include_subreq
</Location>
</Base>
1.259 +3 -0 modperl-2.0/Changes
Index: Changes
===================================================================
RCS file: /home/cvs/modperl-2.0/Changes,v
retrieving revision 1.258
retrieving revision 1.259
diff -u -u -r1.258 -r1.259
--- Changes 22 Nov 2003 08:26:00 -0000 1.258
+++ Changes 22 Nov 2003 10:27:42 -0000 1.259
@@ -12,6 +12,9 @@
=item 1.99_12-dev
+Fix :Apache perlio's STDOUT to be reentrant + modules/include_subreq
+test [Stas]
+
fix slurp_filename to always open the file and not try to guess
whether filename has been already opened, as there is no reliable way
to accomplish that [Stas]