diff options
author | Max Kanat-Alexander <mkanat@bugzilla.org> | 2011-03-13 22:04:32 -0700 |
---|---|---|
committer | Max Kanat-Alexander <mkanat@bugzilla.org> | 2011-03-13 22:04:32 -0700 |
commit | ebc758fb5c94f7441827b8f8201ff3170addcbc7 (patch) | |
tree | daf370445b5e13adfd24402fc1752a6fed51ae58 | |
parent | 8782cbb1c99e52d25a5157b0d3b794459f2b631a (diff) | |
download | bugs-ebc758fb5c94f7441827b8f8201ff3170addcbc7.tar bugs-ebc758fb5c94f7441827b8f8201ff3170addcbc7.tar.gz bugs-ebc758fb5c94f7441827b8f8201ff3170addcbc7.tar.bz2 bugs-ebc758fb5c94f7441827b8f8201ff3170addcbc7.tar.xz bugs-ebc758fb5c94f7441827b8f8201ff3170addcbc7.zip |
Bug 637977: Re-setup CGI.pm global variables on every request under mod_perl,
which prevents CGI.pm from generating URLs with semicolons in them instead
of ampersands.
r=glob, a=mkanat
-rw-r--r-- | Bugzilla.pm | 5 | ||||
-rw-r--r-- | Bugzilla/CGI.pm | 37 |
2 files changed, 29 insertions, 13 deletions
diff --git a/Bugzilla.pm b/Bugzilla.pm index 2c07ea722..9d7199ff6 100644 --- a/Bugzilla.pm +++ b/Bugzilla.pm @@ -647,6 +647,11 @@ sub _cleanup { $dbh->disconnect; } undef $_request_cache; + + # These are both set by CGI.pm but need to be undone so that + # Apache can actually shut down its children if it needs to. + $SIG{TERM} = 'DEFAULT' if $SIG{TERM} eq 'IGNORE'; + $SIG{PIPE} = 'DEFAULT' if $SIG{PIPE} eq 'IGNORE'; } sub END { diff --git a/Bugzilla/CGI.pm b/Bugzilla/CGI.pm index b4e9c714b..3165cb003 100644 --- a/Bugzilla/CGI.pm +++ b/Bugzilla/CGI.pm @@ -23,6 +23,7 @@ package Bugzilla::CGI; use strict; +use base qw(CGI); use Bugzilla::Constants; use Bugzilla::Error; @@ -39,19 +40,6 @@ BEGIN { } } -use CGI qw(-no_xhtml -oldstyle_urls :private_tempfiles - :unique_headers SERVER_PUSH); -use base qw(CGI); - -# We need to disable output buffering - see bug 179174 -$| = 1; - -# Ignore SIGTERM and SIGPIPE - this prevents DB corruption. If the user closes -# their browser window while a script is running, the web server sends these -# signals, and we don't want to die half way through a write. -$::SIG{TERM} = 'IGNORE'; -$::SIG{PIPE} = 'IGNORE'; - # CGI.pm uses AUTOLOAD, but explicitly defines a DESTROY sub. # We need to do so, too, otherwise perl dies when the object is destroyed # and we don't have a DESTROY method (because CGI.pm's AUTOLOAD will |die| @@ -61,10 +49,33 @@ sub DESTROY { $self->SUPER::DESTROY(@_); }; +sub _init_bz_cgi_globals { + my $invocant = shift; + # We need to disable output buffering - see bug 179174 + $| = 1; + + # Ignore SIGTERM and SIGPIPE - this prevents DB corruption. If the user closes + # their browser window while a script is running, the web server sends these + # signals, and we don't want to die half way through a write. + $SIG{TERM} = 'IGNORE'; + $SIG{PIPE} = 'IGNORE'; + + # We don't precompile any functions here, that's done specially in + # mod_perl code. + $invocant->_setup_symbols(qw(:no_xhtml :oldstyle_urls :private_tempfiles + :unique_headers)); +} + +BEGIN { __PACKAGE__->_init_bz_cgi_globals() if i_am_cgi(); } + sub new { my ($invocant, @args) = @_; my $class = ref($invocant) || $invocant; + # Under mod_perl, CGI's global variables get reset on each request, + # so we need to set them up again every time. + $class->_init_bz_cgi_globals() if $ENV{MOD_PERL}; + my $self = $class->SUPER::new(@args); # Make sure our outgoing cookie list is empty on each invocation |