summaryrefslogtreecommitdiff
path: root/include/linux/timerqueue.h
diff options
context:
space:
mode:
authorAl Viro <viro@zeniv.linux.org.uk>2019-08-03 11:51:18 -0400
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2019-11-12 19:13:24 +0100
commit0120fc18b3472c30a2ab943819489a83139ebcf4 (patch)
tree924fa3242b9b615b8afc747202844b46b2ae02bf /include/linux/timerqueue.h
parentd1d4c4364724bf33d5645da2d6dde3005f40aeb2 (diff)
configfs: fix a deadlock in configfs_symlink()
commit 351e5d869e5ac10cb40c78b5f2d7dfc816ad4587 upstream. Configfs abuses symlink(2). Unlike the normal filesystems, it wants the target resolved at symlink(2) time, like link(2) would've done. The problem is that ->symlink() is called with the parent directory locked exclusive, so resolving the target inside the ->symlink() is easily deadlocked. Short of really ugly games in sys_symlink() itself, all we can do is to unlock the parent before resolving the target and relock it after. However, that invalidates the checks done by the caller of ->symlink(), so we have to * check that dentry is still where it used to be (it couldn't have been moved, but it could've been unhashed) * recheck that it's still negative (somebody else might've successfully created a symlink with the same name while we were looking the target up) * recheck the permissions on the parent directory. Cc: stable@vger.kernel.org Signed-off-by: Al Viro <viro@zeniv.linux.org.uk> Signed-off-by: Christoph Hellwig <hch@lst.de> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Diffstat (limited to 'include/linux/timerqueue.h')
0 files changed, 0 insertions, 0 deletions