https://github.com/torvalds/linux
Revision c4fcfc1619ea43a8a89ad2f83ff23905eee088bd authored by Miklos Szeredi on 29 November 2016, 09:20:24 UTC, committed by Miklos Szeredi on 29 November 2016, 09:20:24 UTC
Handling of recursion in d_real() is completely broken.  Recursion is only
done in the 'inode != NULL' case.  But when opening the file we have
'inode == NULL' hence d_real() will return an overlay dentry.  This won't
work since overlayfs doesn't define its own file operations, so all file
ops will fail.

Fix by doing the recursion first and the check against the inode second.

Bash script to reproduce the issue written by Quentin:

 - 8< - - - - - 8< - - - - - 8< - - - - - 8< - - - -
tmpdir=$(mktemp -d)
pushd ${tmpdir}

mkdir -p {upper,lower,work}
echo -n 'rocks' > lower/ksplice
mount -t overlay level_zero upper -o lowerdir=lower,upperdir=upper,workdir=work
cat upper/ksplice

tmpdir2=$(mktemp -d)
pushd ${tmpdir2}

mkdir -p {upper,work}
mount -t overlay level_one upper -o lowerdir=${tmpdir}/upper,upperdir=upper,workdir=work
ls -l upper/ksplice
cat upper/ksplice
 - 8< - - - - - 8< - - - - - 8< - - - - - 8< - - - - 

Reported-by: Quentin Casasnovas <quentin.casasnovas@oracle.com>
Signed-off-by: Miklos Szeredi <mszeredi@redhat.com>
Fixes: 2d902671ce1c ("vfs: merge .d_select_inode() into .d_real()")
Cc: <stable@vger.kernel.org> # v4.8+
1 parent bc33b0c
History
Tip revision: c4fcfc1619ea43a8a89ad2f83ff23905eee088bd authored by Miklos Szeredi on 29 November 2016, 09:20:24 UTC
ovl: fix d_real() for stacked fs
Tip revision: c4fcfc1
File Mode Size
9p
adfs
affs
afs
autofs4
befs
bfs
btrfs
cachefiles
ceph
cifs
coda
configfs
cramfs
crypto
debugfs
devpts
dlm
ecryptfs
efivarfs
efs
exofs
exportfs
ext2
ext4
f2fs
fat
freevxfs
fscache
fuse
gfs2
hfs
hfsplus
hostfs
hpfs
hugetlbfs
isofs
jbd2
jffs2
jfs
kernfs
lockd
logfs
minix
ncpfs
nfs
nfs_common
nfsd
nilfs2
nls
notify
ntfs
ocfs2
omfs
openpromfs
orangefs
overlayfs
proc
pstore
qnx4
qnx6
quota
ramfs
reiserfs
romfs
squashfs
sysfs
sysv
tracefs
ubifs
udf
ufs
xfs
Kconfig -rw-r--r-- 7.2 KB
Kconfig.binfmt -rw-r--r-- 7.2 KB
Makefile -rw-r--r-- 4.3 KB
aio.c -rw-r--r-- 43.1 KB
anon_inodes.c -rw-r--r-- 4.9 KB
attr.c -rw-r--r-- 9.1 KB
bad_inode.c -rw-r--r-- 4.3 KB
binfmt_aout.c -rw-r--r-- 10.7 KB
binfmt_elf.c -rw-r--r-- 60.8 KB
binfmt_elf_fdpic.c -rw-r--r-- 46.9 KB
binfmt_em86.c -rw-r--r-- 2.8 KB
binfmt_flat.c -rw-r--r-- 27.8 KB
binfmt_misc.c -rw-r--r-- 18.3 KB
binfmt_script.c -rw-r--r-- 3.0 KB
block_dev.c -rw-r--r-- 49.7 KB
buffer.c -rw-r--r-- 90.3 KB
char_dev.c -rw-r--r-- 13.5 KB
compat.c -rw-r--r-- 37.1 KB
compat_binfmt_elf.c -rw-r--r-- 3.7 KB
compat_ioctl.c -rw-r--r-- 45.7 KB
coredump.c -rw-r--r-- 20.6 KB
dax.c -rw-r--r-- 40.6 KB
dcache.c -rw-r--r-- 93.5 KB
dcookies.c -rw-r--r-- 6.9 KB
direct-io.c -rw-r--r-- 38.6 KB
drop_caches.c -rw-r--r-- 1.6 KB
eventfd.c -rw-r--r-- 12.9 KB
eventpoll.c -rw-r--r-- 60.1 KB
exec.c -rw-r--r-- 43.7 KB
fcntl.c -rw-r--r-- 16.7 KB
fhandle.c -rw-r--r-- 6.5 KB
file.c -rw-r--r-- 23.6 KB
file_table.c -rw-r--r-- 8.5 KB
filesystems.c -rw-r--r-- 6.4 KB
fs-writeback.c -rw-r--r-- 70.4 KB
fs_pin.c -rw-r--r-- 2.0 KB
fs_struct.c -rw-r--r-- 3.3 KB
inode.c -rw-r--r-- 55.0 KB
internal.h -rw-r--r-- 4.7 KB
ioctl.c -rw-r--r-- 17.2 KB
iomap.c -rw-r--r-- 14.0 KB
libfs.c -rw-r--r-- 30.3 KB
locks.c -rw-r--r-- 73.3 KB
mbcache.c -rw-r--r-- 12.0 KB
mount.h -rw-r--r-- 3.6 KB
mpage.c -rw-r--r-- 20.6 KB
namei.c -rw-r--r-- 120.0 KB
namespace.c -rw-r--r-- 83.3 KB
no-block.c -rw-r--r-- 688 bytes
nsfs.c -rw-r--r-- 5.2 KB
open.c -rw-r--r-- 27.6 KB
pipe.c -rw-r--r-- 27.3 KB
pnode.c -rw-r--r-- 11.4 KB
pnode.h -rw-r--r-- 1.9 KB
posix_acl.c -rw-r--r-- 21.4 KB
proc_namespace.c -rw-r--r-- 7.8 KB
read_write.c -rw-r--r-- 40.6 KB
readdir.c -rw-r--r-- 7.3 KB
select.c -rw-r--r-- 25.7 KB
seq_file.c -rw-r--r-- 23.0 KB
signalfd.c -rw-r--r-- 9.2 KB
splice.c -rw-r--r-- 39.8 KB
stack.c -rw-r--r-- 2.5 KB
stat.c -rw-r--r-- 11.9 KB
statfs.c -rw-r--r-- 5.3 KB
super.c -rw-r--r-- 36.7 KB
sync.c -rw-r--r-- 9.9 KB
timerfd.c -rw-r--r-- 13.2 KB
userfaultfd.c -rw-r--r-- 35.3 KB
utimes.c -rw-r--r-- 5.5 KB
xattr.c -rw-r--r-- 23.5 KB

back to top