selinux: various sparse fixes
authorPaul Moore <paul@paul-moore.com>
Thu, 27 Jan 2022 15:56:13 +0000 (10:56 -0500)
committerPaul Moore <paul@paul-moore.com>
Wed, 2 Feb 2022 00:08:28 +0000 (19:08 -0500)
When running the SELinux code through sparse, there are a handful of
warnings.  This patch resolves some of these warnings caused by
"__rcu" mismatches.

 % make W=1 C=1 security/selinux/

Signed-off-by: Paul Moore <paul@paul-moore.com>
security/selinux/hooks.c
security/selinux/ibpkey.c
security/selinux/netnode.c
security/selinux/netport.c

index b60481192b3807265b52c79f362274761b58565b..b24a1aeeedd43845023f1581518475269dd239af 100644 (file)
@@ -2553,7 +2553,7 @@ static void selinux_bprm_committed_creds(struct linux_binprm *bprm)
        if (rc) {
                clear_itimer();
 
-               spin_lock_irq(&current->sighand->siglock);
+               spin_lock_irq(&unrcu_pointer(current->sighand)->siglock);
                if (!fatal_signal_pending(current)) {
                        flush_sigqueue(&current->pending);
                        flush_sigqueue(&current->signal->shared_pending);
@@ -2561,13 +2561,13 @@ static void selinux_bprm_committed_creds(struct linux_binprm *bprm)
                        sigemptyset(&current->blocked);
                        recalc_sigpending();
                }
-               spin_unlock_irq(&current->sighand->siglock);
+               spin_unlock_irq(&unrcu_pointer(current->sighand)->siglock);
        }
 
        /* Wake up the parent if it is waiting so that it can recheck
         * wait permission to the new task SID. */
        read_lock(&tasklist_lock);
-       __wake_up_parent(current, current->real_parent);
+       __wake_up_parent(current, unrcu_pointer(current->real_parent));
        read_unlock(&tasklist_lock);
 }
 
index 20b3b22438205856f590643cabd013140f7a6f0b..5839ca7bb9c75807097ddb558d199101dfdb7a55 100644 (file)
@@ -104,7 +104,7 @@ static void sel_ib_pkey_insert(struct sel_ib_pkey *pkey)
 
                tail = list_entry(
                        rcu_dereference_protected(
-                               sel_ib_pkey_hash[idx].list.prev,
+                               list_tail_rcu(&sel_ib_pkey_hash[idx].list),
                                lockdep_is_held(&sel_ib_pkey_lock)),
                        struct sel_ib_pkey, list);
                list_del_rcu(&tail->list);
index 889552db0d31a1715655883c55bce6d9ba881d6b..0ac7df9a93677f403fa59f90c36f4fdae8699323 100644 (file)
@@ -164,8 +164,9 @@ static void sel_netnode_insert(struct sel_netnode *node)
        if (sel_netnode_hash[idx].size == SEL_NETNODE_HASH_BKT_LIMIT) {
                struct sel_netnode *tail;
                tail = list_entry(
-                       rcu_dereference_protected(sel_netnode_hash[idx].list.prev,
-                                                 lockdep_is_held(&sel_netnode_lock)),
+                       rcu_dereference_protected(
+                               list_tail_rcu(&sel_netnode_hash[idx].list),
+                               lockdep_is_held(&sel_netnode_lock)),
                        struct sel_netnode, list);
                list_del_rcu(&tail->list);
                kfree_rcu(tail, rcu);
index 9ba09d11c0f5b169f1e2fa6aeda00187e3019927..8eec6347cf012bbd1d286507d032e4890867b1e2 100644 (file)
@@ -113,7 +113,7 @@ static void sel_netport_insert(struct sel_netport *port)
                struct sel_netport *tail;
                tail = list_entry(
                        rcu_dereference_protected(
-                               sel_netport_hash[idx].list.prev,
+                               list_tail_rcu(&sel_netport_hash[idx].list),
                                lockdep_is_held(&sel_netport_lock)),
                        struct sel_netport, list);
                list_del_rcu(&tail->list);