]> git.ipfire.org Git - thirdparty/bugzilla.git/commitdiff
Bug 975896: Bugzilla crashes when editing a flag type which is not specifically reque...
authorFrédéric Buclin <LpSolit@gmail.com>
Mon, 24 Feb 2014 17:14:08 +0000 (18:14 +0100)
committerFrédéric Buclin <LpSolit@gmail.com>
Mon, 24 Feb 2014 17:14:08 +0000 (18:14 +0100)
r/a=glob

Bugzilla/Attachment.pm
Bugzilla/Classification.pm
Bugzilla/FlagType.pm

index d0bd8e4c2c0011cbd8fca67eda8e6910ea7458b3..0f3db88967430a24936593cbee1b8cdfa2637193 100644 (file)
@@ -935,10 +935,10 @@ sub remove_from_db {
     my $dbh = Bugzilla->dbh;
 
     $dbh->bz_start_transaction();
-    my @flag_ids = $dbh->selectrow_array(
+    my $flag_ids = $dbh->selectcol_arrayref(
         'SELECT id FROM flags WHERE attach_id = ?', undef, $self->id);
-    $dbh->do('DELETE FROM flags WHERE ' . $dbh->sql_in('id', \@flag_ids))
-        if @flag_ids;
+    $dbh->do('DELETE FROM flags WHERE ' . $dbh->sql_in('id', $flag_ids))
+        if @$flag_ids;
     $dbh->do('DELETE FROM attach_data WHERE id = ?', undef, $self->id);
     $dbh->do('UPDATE attachments SET mimetype = ?, ispatch = ?, isobsolete = ?
               WHERE attach_id = ?', undef, ('text/plain', 0, 1, $self->id));
@@ -952,7 +952,7 @@ sub remove_from_db {
     # As we don't call SUPER->remove_from_db we need to manually clear
     # memcached here.
     Bugzilla->memcached->clear({ table => 'attachments', id => $self->id });
-    foreach my $flag_id (@flag_ids) {
+    foreach my $flag_id (@$flag_ids) {
         Bugzilla->memcached->clear({ table => 'flags', id => $flag_id });
     }
 }
index 5d488e3b9bc24426638a678c45357600d99500dc..6e88bdc63531e75f950d1e5a4e7a39fb12ce347f 100644 (file)
@@ -48,6 +48,7 @@ use constant VALIDATORS => {
 ###############################
 ####     Constructors     #####
 ###############################
+
 sub remove_from_db {
     my $self = shift;
     my $dbh = Bugzilla->dbh;
@@ -57,13 +58,13 @@ sub remove_from_db {
     $dbh->bz_start_transaction();
 
     # Reclassify products to the default classification, if needed.
-    my @product_ids = $dbh->selectrow_array(
-        "SELECT id FROM products WHERE classification_id = ?",
-        undef, $self->id);
-    if (@product_ids) {
-        $dbh->do("UPDATE products SET classification_id = 1 WHERE " .
-            $dbh->sql_in('id', \@product_ids));
-        foreach my $id (@product_ids) {
+    my $product_ids = $dbh->selectcol_arrayref(
+        'SELECT id FROM products WHERE classification_id = ?', undef, $self->id);
+
+    if (@$product_ids) {
+        $dbh->do('UPDATE products SET classification_id = 1 WHERE '
+                  . $dbh->sql_in('id', $product_ids));
+        foreach my $id (@$product_ids) {
             Bugzilla->memcached->clear({ table => 'products', id => $id });
         }
     }
index c70c1598c1c7cf0343799603bec4eccf9850442d..773996b2e7a0e142355af4a2d94604b205adfb48 100644 (file)
@@ -185,12 +185,15 @@ sub update {
     # Silently remove requestees from flags which are no longer
     # specifically requestable.
     if (!$self->is_requesteeble) {
-        my @ids = $dbh->selectrow_array(
-            "SELECT id FROM flags WHERE type_id = ?", undef, $self->id);
-        $dbh->do("UPDATE flags SET requestee_id = NULL WHERE "
-            . $dbh->sql_in('type_id', \@ids));
-        foreach my $id (@ids) {
-            Bugzilla->memcached->clear({ table => 'flags', id => $id });
+        my $ids = $dbh->selectcol_arrayref(
+            'SELECT id FROM flags WHERE type_id = ? AND requestee_id IS NOT NULL',
+             undef, $self->id);
+
+        if (@$ids) {
+            $dbh->do('UPDATE flags SET requestee_id = NULL WHERE ' . $dbh->sql_in('id', $ids));
+            foreach my $id (@$ids) {
+                Bugzilla->memcached->clear({ table => 'flags', id => $id });
+            }
         }
     }