diff options
| author | Chris Mason <mason@kernel.org> | 2026-10-07 10:53:10 +0000 |
|---|---|---|
| committer | Amir Goldstein <amir73il@gmail.com> | 2026-10-29 13:22:16 +0100 |
| commit | 16d319e12328acafeafd3eecdf09c46d7fb43452 (patch) | |
| tree | dad9dd29ae2dcf1b1b574136a85cb428c0ba75d5 /scripts/basic | |
| parent | 4f61ff2ebfb3d2967b83b6a4d456242244d5a61f (diff) | |
| download | linux-16d319e12328acafeafd3eecdf09c46d7fb43452.tar.gz linux-16d319e12328acafeafd3eecdf09c46d7fb43452.zip | |
ovl: hold a reference on the parent in readdir
Listing a directory on an overlay uses a freed dentry and crashes the
kernel when a lookup moves the directory at the same time.
Code that can sleep may only use d_parent without a reference while
something stops a move of the dentry. ovl_iterate_real(),
ovl_need_adjust_d_ino() and ovl_cache_update() use the d_parent of the
listed directory and hold only the lock of that directory. When a
lookup finds the directory under another parent after a change to a
layer, d_splice_alias() moves it without that lock and drops its
reference on the old parent.
With a delay in ovl_iterate_real(), getdents64 on an overlay directory
raced a rename in the lower layer and a lookup that moved its dentry,
and after an rmdir of the old parent KASAN reported a use-after-free in
security_inode_getattr().
Fix this by using dget_parent() in the three functions.
Fixes: b5efccbe0a12 ("ovl: constant d_ino across copy up")
Cc: stable@vger.kernel.org
Signed-off-by: Chris Mason <mason@kernel.org>
Signed-off-by: Josef Bacik <josef@toxicpanda.com>
[amir: fix comments in ovl_need_adjust_d_ino()]
Signed-off-by: Amir Goldstein <amir73il@gmail.com>
Diffstat (limited to 'scripts/basic')
0 files changed, 0 insertions, 0 deletions
