Patch "nsfs: mark dentry with DCACHE_RCUACCESS" has been added to the 4.4-stable tree
Subsystems (2)
This is a note to let you know that I've just added the patch titled
nsfs: mark dentry with DCACHE_RCUACCESS
to the 4.4-stable tree which can be found at:
http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary
The filename of the patch is:
nsfs-mark-dentry-with-dcache_rcuaccess.patch
and it can be found in the queue-4.4 subdirectory.
If you, or anyone else, feels it should not be added to the stable tree, please let <[email protected]> know about it.
Quoted 1 line
From
073c516ff73557a8f7315066856c04b50383ac34Mon Sep 17 00:00:00 2001
From: Cong Wang <[email protected]>
Date: Wed, 19 Apr 2017 15:11:00 -0700
Subject: nsfs: mark dentry with DCACHE_RCUACCESS
From: Cong Wang <[email protected]>
commit 073c516ff73557a8f7315066856c04b50383ac34 upstream.
Andrey reported a use-after-free in __ns_get_path():
spin_lock include/linux/spinlock.h:299 [inline] lockref_get_not_dead+0x19/0x80 lib/lockref.c:179 __ns_get_path+0x197/0x860 fs/nsfs.c:66 open_related_ns+0xda/0x200 fs/nsfs.c:143 sock_ioctl+0x39d/0x440 net/socket.c:1001 vfs_ioctl fs/ioctl.c:45 [inline] do_vfs_ioctl+0x1bf/0x1780 fs/ioctl.c:685 SYSC_ioctl fs/ioctl.c:700 [inline] SyS_ioctl+0x8f/0xc0 fs/ioctl.c:691
We are under rcu read lock protection at that point:
rcu_read_lock();
d = atomic_long_read(&ns->stashed);
if (!d)
goto slow;
dentry = (struct dentry *)d;
if (!lockref_get_not_dead(&dentry->d_lockref))
goto slow;
rcu_read_unlock();but don't use a proper RCU API on the free path, therefore a parallel __d_free() could free it at the same time. We need to mark the stashed dentry with DCACHE_RCUACCESS so that __d_free() will be called after all readers leave RCU.
--- fs/nsfs.c | 1 + 1 file changed, 1 insertion(+)
fs/nsfs.c +1 -0
@@ -95,6 +95,7 @@ slow:return ERR_PTR (-ENOMEM ); }d_instantiate (dentry, inode); + dentry->d_flags |=DCACHE_RCUACCESS ; dentry->d_fsdata = (void *)ns_ops; d =atomic_long_cmpxchg (&ns->stashed,0 , (unsigned long )dentry);if (d) {
Patches currently in stable-queue which might be from [email protected] are
queue-4.4/nsfs-mark-dentry-with-dcache_rcuaccess.patch