mirror of
https://github.com/torvalds/linux.git
synced 2024-10-23 21:50:43 +00:00
ovl: fix dentry reference leak after changes to underlying layers
syzbot excercised the forbidden practice of moving the workdir under
lowerdir while overlayfs is mounted and tripped a dentry reference leak.
Fixes: c63e56a4a6
("ovl: do not open/llseek lower file with upper sb_writers held")
Reported-and-tested-by: syzbot+8608bb4553edb8c78f41@syzkaller.appspotmail.com
Signed-off-by: Amir Goldstein <amir73il@gmail.com>
This commit is contained in:
parent
98b1cc82c4
commit
413ba91089
|
@ -753,15 +753,16 @@ static int ovl_copy_up_workdir(struct ovl_copy_up_ctx *c)
|
|||
path.dentry = temp;
|
||||
err = ovl_copy_up_data(c, &path);
|
||||
/*
|
||||
* We cannot hold lock_rename() throughout this helper, because or
|
||||
* We cannot hold lock_rename() throughout this helper, because of
|
||||
* lock ordering with sb_writers, which shouldn't be held when calling
|
||||
* ovl_copy_up_data(), so lock workdir and destdir and make sure that
|
||||
* temp wasn't moved before copy up completion or cleanup.
|
||||
* If temp was moved, abort without the cleanup.
|
||||
*/
|
||||
ovl_start_write(c->dentry);
|
||||
if (lock_rename(c->workdir, c->destdir) != NULL ||
|
||||
temp->d_parent != c->workdir) {
|
||||
/* temp or workdir moved underneath us? abort without cleanup */
|
||||
dput(temp);
|
||||
err = -EIO;
|
||||
goto unlock;
|
||||
} else if (err) {
|
||||
|
|
Loading…
Reference in New Issue
Block a user