Commit 672e4268 authored by Chen Zhongjin's avatar Chen Zhongjin Committed by Miklos Szeredi
Browse files

ovl: fix use inode directly in rcu-walk mode



ovl_dentry_revalidate_common() can be called in rcu-walk mode.  As document
said, "in rcu-walk mode, d_parent and d_inode should not be used without
care".

Check inode here to protect access under rcu-walk mode.

Fixes: bccece1e ("ovl: allow remote upper")
Reported-and-tested-by: default avatar <syzbot+a4055c78774bbf3498bb@syzkaller.appspotmail.com>
Signed-off-by: default avatarChen Zhongjin <chenzhongjin@huawei.com>
Cc: <stable@vger.kernel.org> # v5.7
Signed-off-by: default avatarMiklos Szeredi <mszeredi@redhat.com>
parent eb708140
Loading
Loading
Loading
Loading
+6 −1
Original line number Diff line number Diff line
@@ -139,11 +139,16 @@ static int ovl_dentry_revalidate_common(struct dentry *dentry,
					unsigned int flags, bool weak)
{
	struct ovl_entry *oe = dentry->d_fsdata;
	struct inode *inode = d_inode_rcu(dentry);
	struct dentry *upper;
	unsigned int i;
	int ret = 1;

	upper = ovl_dentry_upper(dentry);
	/* Careful in RCU mode */
	if (!inode)
		return -ECHILD;

	upper = ovl_i_dentry_upper(inode);
	if (upper)
		ret = ovl_revalidate_real(upper, flags, weak);