Hello,
As a follow-up to my previous bug report to users@,
( http://www.gossamer-threads.com/lists/modperl/modperl/94912 )
I'd like to re-post the same issue to dev@, because I'm unsure
what is the status of this bugreport, and basically if it
was recognized as one.
Just for the sake if the test wasn't reproduced correctly, I'll rerun:
1) test setup:
add to httpd.conf:
<LocationMatch "^/cgi-bin/m.cgi$">
SetHandler perl-script
PerlResponseHandler ModPerl::Registry
PerlOptions +ParseHeaders
</LocationMatch>
<LocationMatch "^/cgi-bin/a.cgi$">
SetHandler cgi-script
</LocationMatch>
both cgis are identical, and are:
#!/usr/bin/perl -w
print "Content-type: text/html\n\n", $ENV{MOD_PERL}||'', "\n", <STDIN>, "\n";
test.pl:
open F, "|nc localhost 80"; # this requires netcat because I'm lazy
print F <<R;
POST /cgi-bin/m.cgi HTTP/1.1
Host: localhost
Content-Type: application/x-www-form-urlencoded
Content-Length: 13
Keep-Alive: 300
submit=Submit
POST /cgi-bin/a.cgi HTTP/1.1
Host: localhost
Content-Type: application/x-www-form-urlencoded
Content-Length: 13
Keep-Alive: 0
Connection: close
submit=Submit
R
2)
- now, stop apache, run it from console as 'httpd -X' ( or apache2 -X on some
linux distros)
- run 'perl test.pl'
The bug manifests itself in that the following apache response is printed out
(some lines are skipped):
HTTP/1.1 200 OK
1d
mod_perl/2.0.3
submit=Submit
0
HTTP/1.1 200 OK
Connection: close
Content-Type: text/html
2
0
and the second request doesn't contain 'submit=Submit' line.
This can be fixed by applying the following patch:
--- modperl_io.c.orig 2007-09-25 15:36:02.000000000 +0200
+++ modperl_io.c 2007-09-25 15:35:51.000000000 +0200
@@ -129,6 +129,15 @@
Perl_croak(aTHX_ "Failed to dup STDIN: %" SVf, get_sv("!", TRUE));
}
+ /* In mixed environment of mod_perl and cgi scripts, cgi scripts may read
content of
+ * POST requests off STDIN. do_close() calls actual close(0), freeing the
descriptor 0
+ * for reuse, and creating havoc for anyone reading from file descriptor 0.
+ * This hack changes the IO type to IoTYPE_STD, because do_close() does not
call
+ * underlying close() on IO handles of these types, but does free the
associated
+ * resources. */
+ if ( IoIFP(io) && PerlIO_fileno(IoIFP(io)) == 0)
+ IoTYPE(io) = IoTYPE_STD;
+
/* similar to PerlIO::scalar, the PerlIO::Apache layer doesn't
* have file descriptors, so STDIN must be closed before it can
* be reopened */
So, I'm not sure what other information I can provide, please tell me if
there's anything
more, because I'd love to see that bug fixed.
--
Sincerely,
Dmitry Karasik
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]