netfilter: xt_qtaguid: fix error exit that would keep a spinlock.
authorJP Abgrall <jpa@google.com>
Wed, 10 Oct 2012 03:38:21 +0000 (20:38 -0700)
committerJohn Stultz <john.stultz@linaro.org>
Tue, 16 Feb 2016 21:51:27 +0000 (13:51 -0800)
qtudev_open() could return with a uid_tag_data_tree_lock held
when an kzalloc(..., GFP_ATOMIC) would fail.
Very unlikely to get triggered AND survive the mayhem of running out of mem.

Signed-off-by: JP Abgrall <jpa@google.com>
net/netfilter/xt_qtaguid.c

index 14b003da1423a0fb76fc46f4cd49bd7b43cff5a4..6b22563a924fe5386dc0d387121efd220bdf5d63 100644 (file)
@@ -2752,7 +2752,7 @@ static int qtudev_open(struct inode *inode, struct file *file)
        utd_entry = get_uid_data(current_fsuid(), &utd_entry_found);
        if (IS_ERR_OR_NULL(utd_entry)) {
                res = PTR_ERR(utd_entry);
-               goto err;
+               goto err_unlock;
        }
 
        /* Look for existing PID based proc_data */
@@ -2794,8 +2794,8 @@ err_unlock_free_utd:
                rb_erase(&utd_entry->node, &uid_tag_data_tree);
                kfree(utd_entry);
        }
+err_unlock:
        spin_unlock_bh(&uid_tag_data_tree_lock);
-err:
        return res;
 }