perl-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Dmitry Karasik <>
Subject [mp2] mod_perl closes apache's stdin and/or stdout
Date Mon, 01 Oct 2007 14:49:57 GMT

As a follow-up to my previous bug report to users@,
( )
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 "^/cgi-bin/a.cgi$">
               SetHandler cgi-script

	both cgis are identical, and are:

#!/usr/bin/perl -w
print "Content-type: text/html\n\n", $ENV{MOD_PERL}||'', "\n", <STDIN>, "\n";

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


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



- now, stop apache, run it from console as 'httpd -X' ( or apache2 -X on some linux distros)
- run 'perl'

The bug manifests itself in that the following apache response is printed out (some lines
are skipped):

HTTP/1.1 200 OK

HTTP/1.1 200 OK
Connection: close
Content-Type: text/html

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.

	Dmitry Karasik

To unsubscribe, e-mail:
For additional commands, e-mail:

View raw message