fsnotify: Fix possible use-after-free in inode iteration on umount
authorJan Kara <jack@suse.cz>
Mon, 12 Dec 2016 15:08:41 +0000 (16:08 +0100)
committerBen Hutchings <ben@decadent.org.uk>
Thu, 16 Mar 2017 02:18:31 +0000 (02:18 +0000)
commit3c67dcc8054bf71be30a91a8c2b10a4c88ed9663
treee1e3b1de1d22173f997df8576a6372ff2af16512
parentd148f1617ddb4e830e4d6974fda6a5db27bdb7ec
fsnotify: Fix possible use-after-free in inode iteration on umount

commit 5716863e0f8251d3360d4cbfc0e44e08007075df upstream.

fsnotify_unmount_inodes() plays complex tricks to pin next inode in the
sb->s_inodes list when iterating over all inodes. Furthermore the code has a
bug that if the current inode is the last on i_sb_list that does not have e.g.
I_FREEING set, then we leave next_i pointing to inode which may get removed
from the i_sb_list once we drop s_inode_list_lock thus resulting in
use-after-free issues (usually manifesting as infinite looping in
fsnotify_unmount_inodes()).

Fix the problem by keeping current inode pinned somewhat longer. Then we can
make the code much simpler and standard.

Signed-off-by: Jan Kara <jack@suse.cz>
[bwh: Backported to 3.2: adjust context]
Signed-off-by: Ben Hutchings <ben@decadent.org.uk>
fs/notify/inode_mark.c