]> git.ipfire.org Git - thirdparty/kernel/stable-queue.git/commitdiff
4.9-stable patches
authorGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 15 Feb 2018 06:00:26 +0000 (07:00 +0100)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 15 Feb 2018 06:00:26 +0000 (07:00 +0100)
added patches:
nsfs-mark-dentry-with-dcache_rcuaccess.patch

queue-4.9/nsfs-mark-dentry-with-dcache_rcuaccess.patch [new file with mode: 0644]
queue-4.9/series

diff --git a/queue-4.9/nsfs-mark-dentry-with-dcache_rcuaccess.patch b/queue-4.9/nsfs-mark-dentry-with-dcache_rcuaccess.patch
new file mode 100644 (file)
index 0000000..9b3b6e3
--- /dev/null
@@ -0,0 +1,60 @@
+From 073c516ff73557a8f7315066856c04b50383ac34 Mon Sep 17 00:00:00 2001
+From: Cong Wang <xiyou.wangcong@gmail.com>
+Date: Wed, 19 Apr 2017 15:11:00 -0700
+Subject: nsfs: mark dentry with DCACHE_RCUACCESS
+
+From: Cong Wang <xiyou.wangcong@gmail.com>
+
+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.
+
+Fixes: e149ed2b805f ("take the targets of /proc/*/ns/* symlinks to separate fs")
+Cc: Alexander Viro <viro@zeniv.linux.org.uk>
+Cc: Andrew Morton <akpm@linux-foundation.org>
+Reported-by: Andrey Konovalov <andreyknvl@google.com>
+Signed-off-by: Cong Wang <xiyou.wangcong@gmail.com>
+Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
+Cc: Eric Biggers <ebiggers3@gmail.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ fs/nsfs.c |    1 +
+ 1 file changed, 1 insertion(+)
+
+--- a/fs/nsfs.c
++++ b/fs/nsfs.c
+@@ -90,6 +90,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) {
index 37e864772ddde67c7ceb4c717ac9053df39300ea..adc09a5dbad9ad63765d227571bbd947497d32b7 100644 (file)
@@ -32,3 +32,4 @@ crypto-hash-introduce-crypto_hash_alg_has_setkey.patch
 crypto-cryptd-pass-through-absence-of-setkey.patch
 crypto-mcryptd-pass-through-absence-of-setkey.patch
 crypto-poly1305-remove-setkey-method.patch
+nsfs-mark-dentry-with-dcache_rcuaccess.patch