diff options
author | Jan Kara <jack@suse.cz> | 2024-11-26 12:55:12 +0100 |
---|---|---|
committer | Jan Kara <jack@suse.cz> | 2024-11-26 22:54:24 +0100 |
commit | 6756af923e06aa33ad8894aaecbf9060953ba00f (patch) | |
tree | a45f623bd4bd02bc7232fcfae68f624c0c94605c /fs/udf | |
parent | udf: Skip parent dir link count update if corrupted (diff) | |
download | linux-6756af923e06aa33ad8894aaecbf9060953ba00f.tar.xz linux-6756af923e06aa33ad8894aaecbf9060953ba00f.zip |
udf: Verify inode link counts before performing rename
During rename, we are updating link counts of various inodes either when
rename deletes target or when moving directory across directories.
Verify involved link counts are sane so that we don't trip warnings in
VFS.
Reported-by: syzbot+3ff7365dc04a6bcafa66@syzkaller.appspotmail.com
Signed-off-by: Jan Kara <jack@suse.cz>
Diffstat (limited to 'fs/udf')
-rw-r--r-- | fs/udf/namei.c | 10 |
1 files changed, 10 insertions, 0 deletions
diff --git a/fs/udf/namei.c b/fs/udf/namei.c index 2be775d30ac1..2cb49b6b0716 100644 --- a/fs/udf/namei.c +++ b/fs/udf/namei.c @@ -791,8 +791,18 @@ static int udf_rename(struct mnt_idmap *idmap, struct inode *old_dir, retval = -ENOTEMPTY; if (!empty_dir(new_inode)) goto out_oiter; + retval = -EFSCORRUPTED; + if (new_inode->i_nlink != 2) + goto out_oiter; } + retval = -EFSCORRUPTED; + if (old_dir->i_nlink < 3) + goto out_oiter; is_dir = true; + } else if (new_inode) { + retval = -EFSCORRUPTED; + if (new_inode->i_nlink < 1) + goto out_oiter; } if (is_dir && old_dir != new_dir) { retval = udf_fiiter_find_entry(old_inode, &dotdot_name, |