Item14221: Regression: writing to STDERR is broken under FastCGI
Priority: Urgent
Current State: Closed
Released In: 2.1.3
Target Release: n/a
There is a change committed as part of
Item14205 which now stops STDERR from being used as a poor man's debugging tool.
This commit seems to have broken it.
The comments in the engine code recommend to write to
$engine->{fhERR}
instead. This is not a viable solution.
die() and Carp.pm all use STDERR and we need this output in the webserver's error.log.
Even the defaults to still use STDERR as usual don't seem to work.
--
MichaelDaum - 18 Nov 2016
This breaks
my @keys = $request->param()
for POSTed data as well. I don't understand the code but reverting this:
diff --git a/core/lib/Foswiki/Engine/CGI.pm b/core/lib/Foswiki/Engine/CGI.pm
index 2d87e25..5fbca2b 100644
--- a/core/lib/Foswiki/Engine/CGI.pm
+++ b/core/lib/Foswiki/Engine/CGI.pm
@@ -234,7 +234,7 @@ sub prepareBody {
# as breaking uploads (though cdot believes this is because of the
# deprecated dual nature of param delivering lightweight file handles,
# and it would probably work in Foswiki. Just not tried it)
- my $cgi = new CGI( $this->{fhIN} );
+ my $cgi = new CGI();
my $err = $cgi->cgi_error;
throw Foswiki::EngineException( $1, $2 )
and this
diff --git a/FastCGIEngineContrib/lib/Foswiki/Engine/FastCGI.pm b/FastCGIEngineContrib/lib/Foswiki/Engine/FastCGI.pm
index 2808d3c..8d0e779 100644
--- a/FastCGIEngineContrib/lib/Foswiki/Engine/FastCGI.pm
+++ b/FastCGIEngineContrib/lib/Foswiki/Engine/FastCGI.pm
@@ -66,12 +66,7 @@ sub run {
}
$args ||= {};
- # Prepare output handles for FastCGI.
- $this->{$_} = IO::Handle->new foreach qw(fhIN fhOUT fhERR);
- # This is a little trick to make all `print STDERR' clauses send their
- # output to the log file. May not work for spawned processes.
- STDERR->fdopen($this->{fhERR}->fileno, "w");
- my $r = FCGI::Request( $this->{fhIN}, $this->{fhOUT}, $this->{fhERR}, \%ENV, $sock,
+ my $r = FCGI::Request( \*STDIN, \*STDOUT, \*STDERR, \%ENV, $sock,
&FCGI::FAIL_ACCEPT_ON_INTR );
my $manager;
@@ -189,12 +184,11 @@ sub preparePath {
$ENV{PATH_INFO} =~ s#^$Foswiki::cfg{ScriptUrlPath}/*#/#
if ( $ENV{PATH_INFO} && defined $Foswiki::cfg{ScriptUrlPath} );
- return $this->SUPER::preparePath();
+ return $this->SUPER::preparePath(@_);
}
sub write {
- my $this = shift;
- syswrite $this->{fhOUT}, $_[0];
+ syswrite STDOUT, $_[1];
}
fixes it again. Before reverting, please comment on above code changes. Obviously some unit tests are missing that iterate over POSTed params.
Steps to reproduce:
- add
my @keys = $request->param(); print STDERR "keys=@keys\n";
somewhere in the code
- do a file upload
Either you don't get an error in your webserver's error.logs. or STDERR should look wild due to the uploaded payload in the POSTDATA being returned to the keys.
--
MichaelDaum - 18 Nov 2016
POST is fine again after
f6350568d343, printing to STDERR is still broken. Maybe this is due to nginx and
FastCGI::ProcManager
being different than apache's mod_fcgi.
--
MichaelDaum - 22 Nov 2016
I was using apache 2.2 and mod_fcgid for testing.
--
VadimBelman - 24 Nov 2016
Setting to closed. This was never in a shipped release, so no need to document.
--
GeorgeClark - 05 Dec 2016