NFS: Use parent's objective cred in nfs_access_login_time()
authorScott Mayhew <smayhew@redhat.com>
Tue, 5 Dec 2023 14:10:54 +0000 (09:10 -0500)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 25 Jan 2024 23:35:18 +0000 (15:35 -0800)
[ Upstream commit a10a9233073d984b239e22358ba21825e27e2e88 ]

The subjective cred (task->cred) can potentially be overridden and
subsquently freed in non-RCU context, which could lead to a panic if we
try to use it in cred_fscmp().  Use __task_cred(), which returns the
objective cred (task->real_cred) instead.

Fixes: 0eb43812c027 ("NFS: Clear the file access cache upon login")
Fixes: 5e9a7b9c2ea1 ("NFS: Fix up a sparse warning")

Signed-off-by: Scott Mayhew <smayhew@redhat.com>
Signed-off-by: Anna Schumaker <Anna.Schumaker@Netapp.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
fs/nfs/dir.c

index e6a51fd..9fc5061 100644 (file)
@@ -2968,7 +2968,7 @@ static u64 nfs_access_login_time(const struct task_struct *task,
        rcu_read_lock();
        for (;;) {
                parent = rcu_dereference(task->real_parent);
-               pcred = rcu_dereference(parent->cred);
+               pcred = __task_cred(parent);
                if (parent == task || cred_fscmp(pcred, cred) != 0)
                        break;
                task = parent;