Commit ef306913 authored by Frédéric Buclin's avatar Frédéric Buclin

Bug 926952: Possible race conditions when editing or deleting a milestone or a version

r/a=glob
parent 663b5520
...@@ -98,10 +98,12 @@ sub run_create_validators { ...@@ -98,10 +98,12 @@ sub run_create_validators {
sub update { sub update {
my $self = shift; my $self = shift;
my $dbh = Bugzilla->dbh;
$dbh->bz_start_transaction();
my $changes = $self->SUPER::update(@_); my $changes = $self->SUPER::update(@_);
if (exists $changes->{value}) { if (exists $changes->{value}) {
my $dbh = Bugzilla->dbh;
# The milestone value is stored in the bugs table instead of its ID. # The milestone value is stored in the bugs table instead of its ID.
$dbh->do('UPDATE bugs SET target_milestone = ? $dbh->do('UPDATE bugs SET target_milestone = ?
WHERE target_milestone = ? AND product_id = ?', WHERE target_milestone = ? AND product_id = ?',
...@@ -112,6 +114,8 @@ sub update { ...@@ -112,6 +114,8 @@ sub update {
WHERE id = ? AND defaultmilestone = ?', WHERE id = ? AND defaultmilestone = ?',
undef, ($self->name, $self->product_id, $changes->{value}->[0])); undef, ($self->name, $self->product_id, $changes->{value}->[0]));
} }
$dbh->bz_commit_transaction();
return $changes; return $changes;
} }
...@@ -119,6 +123,8 @@ sub remove_from_db { ...@@ -119,6 +123,8 @@ sub remove_from_db {
my $self = shift; my $self = shift;
my $dbh = Bugzilla->dbh; my $dbh = Bugzilla->dbh;
$dbh->bz_start_transaction();
# The default milestone cannot be deleted. # The default milestone cannot be deleted.
if ($self->name eq $self->product->default_milestone) { if ($self->name eq $self->product->default_milestone) {
ThrowUserError('milestone_is_default', { milestone => $self }); ThrowUserError('milestone_is_default', { milestone => $self });
...@@ -147,8 +153,9 @@ sub remove_from_db { ...@@ -147,8 +153,9 @@ sub remove_from_db {
Bugzilla->user->id, $timestamp); Bugzilla->user->id, $timestamp);
} }
} }
$self->SUPER::remove_from_db(); $self->SUPER::remove_from_db();
$dbh->bz_commit_transaction();
} }
################################ ################################
......
...@@ -118,14 +118,18 @@ sub bug_count { ...@@ -118,14 +118,18 @@ sub bug_count {
sub update { sub update {
my $self = shift; my $self = shift;
my $dbh = Bugzilla->dbh;
$dbh->bz_start_transaction();
my ($changes, $old_self) = $self->SUPER::update(@_); my ($changes, $old_self) = $self->SUPER::update(@_);
if (exists $changes->{value}) { if (exists $changes->{value}) {
my $dbh = Bugzilla->dbh;
$dbh->do('UPDATE bugs SET version = ? $dbh->do('UPDATE bugs SET version = ?
WHERE version = ? AND product_id = ?', WHERE version = ? AND product_id = ?',
undef, ($self->name, $old_self->name, $self->product_id)); undef, ($self->name, $old_self->name, $self->product_id));
} }
$dbh->bz_commit_transaction();
return $changes; return $changes;
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment