]> git.ipfire.org Git - thirdparty/bugzilla.git/commitdiff
Bug 637977: Re-setup CGI.pm global variables on every request under mod_perl,
authorMax Kanat-Alexander <mkanat@bugzilla.org>
Mon, 14 Mar 2011 05:04:32 +0000 (22:04 -0700)
committerMax Kanat-Alexander <mkanat@bugzilla.org>
Mon, 14 Mar 2011 05:04:32 +0000 (22:04 -0700)
which prevents CGI.pm from generating URLs with semicolons in them instead
of ampersands.
r=glob, a=mkanat

Bugzilla.pm
Bugzilla/CGI.pm

index 2c07ea72274c1f605926ecafaefb6b91a92731c0..9d7199ff6f42ce377a0a2ec2eacf7d629b72b51a 100644 (file)
@@ -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 {
index b4e9c714b3200d9c6a5adabe6b79bba977d6aa46..3165cb003e2bb474c4b5373f9a6ddcb7cef3564b 100644 (file)
@@ -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