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

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

diff --git a/queue-4.4/nsfs-mark-dentry-with-dcache_rcuaccess.patch b/queue-4.4/nsfs-mark-dentry-with-dcache_rcuaccess.patch
new file mode 100644 (file)
index 0000000..d075059
--- /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
+@@ -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) {
index 264f5e9397e368f81bc2bff112942f57df4c4a8d..249f802c5020d933bfb41c57afc7761e17f9a364 100644 (file)
@@ -67,3 +67,4 @@ ahci-add-intel-cannon-lake-pch-h-pci-id.patch
 crypto-hash-introduce-crypto_hash_alg_has_setkey.patch
 crypto-cryptd-pass-through-absence-of-setkey.patch
 crypto-poly1305-remove-setkey-method.patch
+nsfs-mark-dentry-with-dcache_rcuaccess.patch