NACK/Cmnt: [SRU][F][PATCH 2/2] nilfs2: fix use-after-free bug of struct nilfs_root
Stefan Bader
stefan.bader at canonical.com
Mon Nov 14 09:13:29 UTC 2022
On 11.11.22 19:56, Yuxuan Luo wrote:
> From: Ryusuke Konishi <konishi.ryusuke at gmail.com>
>
> If the beginning of the inode bitmap area is corrupted on disk, an inode
> with the same inode number as the root inode can be allocated and fail
> soon after. In this case, the subsequent call to nilfs_clear_inode() on
> that bogus root inode will wrongly decrement the reference counter of
> struct nilfs_root, and this will erroneously free struct nilfs_root,
> causing kernel oopses.
>
> This fixes the problem by changing nilfs_new_inode() to skip reserved
> inode numbers while repairing the inode bitmap.
>
> Link: https://lkml.kernel.org/r/20221003150519.39789-1-konishi.ryusuke@gmail.com
> Signed-off-by: Ryusuke Konishi <konishi.ryusuke at gmail.com>
> Reported-by: syzbot+b8c672b0e22615c80fe0 at syzkaller.appspotmail.com
> Reported-by: Khalid Masum <khalid.masum.92 at gmail.com>
> Tested-by: Ryusuke Konishi <konishi.ryusuke at gmail.com>
> Cc: <stable at vger.kernel.org>
> Signed-off-by: Andrew Morton <akpm at linux-foundation.org>
> (cherry picked from commit d325dc6eb763c10f591c239550b8c7e5466a5d09)
> CVE-2022-3649
> Signed-off-by: Yuxuan Luo <yuxuan.luo at canonical.com>
> ---
This should be a thread with a cover email which indicates all target series.
-Stefan
> fs/nilfs2/inode.c | 17 ++++++++++++++++-
> 1 file changed, 16 insertions(+), 1 deletion(-)
>
> diff --git a/fs/nilfs2/inode.c b/fs/nilfs2/inode.c
> index bfc7ae219a8d..cd959f4378bc 100644
> --- a/fs/nilfs2/inode.c
> +++ b/fs/nilfs2/inode.c
> @@ -340,6 +340,7 @@ struct inode *nilfs_new_inode(struct inode *dir, umode_t mode)
> struct inode *inode;
> struct nilfs_inode_info *ii;
> struct nilfs_root *root;
> + struct buffer_head *bh;
> int err = -ENOMEM;
> ino_t ino;
>
> @@ -355,11 +356,25 @@ struct inode *nilfs_new_inode(struct inode *dir, umode_t mode)
> ii->i_state = BIT(NILFS_I_NEW);
> ii->i_root = root;
>
> - err = nilfs_ifile_create_inode(root->ifile, &ino, &ii->i_bh);
> + err = nilfs_ifile_create_inode(root->ifile, &ino, &bh);
> if (unlikely(err))
> goto failed_ifile_create_inode;
> /* reference count of i_bh inherits from nilfs_mdt_read_block() */
>
> + if (unlikely(ino < NILFS_USER_INO)) {
> + nilfs_warn(sb,
> + "inode bitmap is inconsistent for reserved inodes");
> + do {
> + brelse(bh);
> + err = nilfs_ifile_create_inode(root->ifile, &ino, &bh);
> + if (unlikely(err))
> + goto failed_ifile_create_inode;
> + } while (ino < NILFS_USER_INO);
> +
> + nilfs_info(sb, "repaired inode bitmap for reserved inodes");
> + }
> + ii->i_bh = bh;
> +
> atomic64_inc(&root->inodes_count);
> inode_init_owner(inode, dir, mode);
> inode->i_ino = ino;
-------------- next part --------------
A non-text attachment was scrubbed...
Name: OpenPGP_signature
Type: application/pgp-signature
Size: 833 bytes
Desc: OpenPGP digital signature
URL: <https://lists.ubuntu.com/archives/kernel-team/attachments/20221114/4740df1c/attachment.sig>
More information about the kernel-team
mailing list