diff options
author | bbaetz%acm.org <> | 2003-02-14 19:37:38 +0100 |
---|---|---|
committer | bbaetz%acm.org <> | 2003-02-14 19:37:38 +0100 |
commit | a88bc79dcd14ef13b9a4850c5192981201aa23bf (patch) | |
tree | 3a9f651dbc1b016ab7365590def2e3d891d7ad41 | |
parent | d59e06001d9634de6b5297f9ed93e278b393706a (diff) | |
download | bugzilla-a88bc79dcd14ef13b9a4850c5192981201aa23bf.tar.gz bugzilla-a88bc79dcd14ef13b9a4850c5192981201aa23bf.tar.xz |
Bug 192531 - Bugzilla not properly closing DB statement handles
Change code to work arround a perl < 5.8 leak when localising the tied
statement attributes. Also, clear the sql statestack compat stuff so that
the handles are really dead by the time we disconnect
r,a=justdave
-rw-r--r-- | Bugzilla.pm | 11 | ||||
-rw-r--r-- | Bugzilla/DB.pm | 20 |
2 files changed, 21 insertions, 10 deletions
diff --git a/Bugzilla.pm b/Bugzilla.pm index 56d1f24cc..366acb163 100644 --- a/Bugzilla.pm +++ b/Bugzilla.pm @@ -94,6 +94,17 @@ sub switch_to_main_db { sub _cleanup { undef $_cgi; + # See bug 192531. If we don't clear the possibly active statement handles, + # then when this is called from the END block, it happens _before_ the + # destructors in Bugzilla::DB have happened. + # See http://rt.perl.org/rt2/Ticket/Display.html?id=17450#38810 + # Without disconnecting explicitly here, noone notices, because DBI::END + # ends up calling DBD::mysql's $drh->disconnect_all, which is a noop. + # This code is evil, but it needs to be done, at least until SendSQL and + # friends can be removed + @Bugzilla::DB::SQLStateStack = (); + undef $Bugzilla::DB::_current_sth; + # When we support transactions, need to ->rollback here $_dbh_main->disconnect if $_dbh_main; $_dbh_shadow->disconnect if $_dbh_shadow and Param("shadowdb"); diff --git a/Bugzilla/DB.pm b/Bugzilla/DB.pm index 23078369a..0de9b612c 100644 --- a/Bugzilla/DB.pm +++ b/Bugzilla/DB.pm @@ -54,13 +54,21 @@ sub ConnectToDatabase { } # XXX - mod_perl -my $_current_sth; +# These use |our| instead of |my| because they need to be cleared from +# Bugzilla.pm. See bug 192531 for details. +our $_current_sth; +our @SQLStateStack = (); sub SendSQL { my ($str) = @_; require Bugzilla; $_current_sth = Bugzilla->dbh->prepare($str); + + # This is really really ugly, but its what we get for not doing + # error checking for 5 years. See bug 189446 and bug 192531 + $_current_sth->{RaiseError} = 0; + return $_current_sth->execute; } @@ -98,12 +106,7 @@ sub FetchSQLData { return @result; } - # This is really really ugly, but its what we get for not doing - # error checking for 5 years. See bug 189446. - { - local $_current_sth->{RaiseError}; - return $_current_sth->fetchrow_array; - } + return $_current_sth->fetchrow_array; } sub FetchOneColumn { @@ -111,9 +114,6 @@ sub FetchOneColumn { return $row[0]; } -# XXX - mod_perl -my @SQLStateStack = (); - sub PushGlobalSQLState() { push @SQLStateStack, $_current_sth; push @SQLStateStack, $_fetchahead; |