Re: [syzbot] [fs?] KASAN: slab-use-after-free Read in test_bdev_super_fc
From: Christian Brauner
Date: Fri Aug 04 2023 - 11:31:05 EST
On Fri, Aug 04, 2023 at 04:49:23PM +0200, Christian Brauner wrote:
> On Fri, Aug 04, 2023 at 04:43:43PM +0200, Christoph Hellwig wrote:
> > On Fri, Aug 04, 2023 at 04:36:49PM +0200, Christian Brauner wrote:
> > > FFS
> >
> > Good spot, this explains the missing dropping of s_umount.
> >
> > But I don't think it's doing the right thing for MTD mount romfs,
> > we'll need something like this:
>
> I'll fold a fix into Jan's patch.
Folding:
diff --git a/fs/romfs/super.c b/fs/romfs/super.c
index c59b230d55b4..2b9f3e3c052a 100644
--- a/fs/romfs/super.c
+++ b/fs/romfs/super.c
@@ -583,16 +583,20 @@ static int romfs_init_fs_context(struct fs_context *fc)
*/
static void romfs_kill_sb(struct super_block *sb)
{
+ generic_shutdown_super(sb);
+
#ifdef CONFIG_ROMFS_ON_MTD
if (sb->s_mtd) {
- kill_mtd_super(sb);
- return;
+ put_mtd_device(sb->s_mtd);
+ sb->s_mtd = NULL;
}
#endif
#ifdef CONFIG_ROMFS_ON_BLOCK
if (sb->s_bdev) {
- kill_block_super(sb);
- return;
+ sb->s_bdev->bd_super = NULL;
+ sync_blockdev(sb->s_bdev);
+ blkdev_put(sb->s_bdev, sb->s_type);
}
#endif
}
diff --git a/fs/cramfs/inode.c b/fs/cramfs/inode.c
index 27c6597aa1be..0b6cc8a03b54 100644
--- a/fs/cramfs/inode.c
+++ b/fs/cramfs/inode.c
@@ -485,12 +485,17 @@ static void cramfs_kill_sb(struct super_block *sb)
{
struct cramfs_sb_info *sbi = CRAMFS_SB(sb);
+ generic_shutdown_super(sb);
+
if (IS_ENABLED(CONFIG_CRAMFS_MTD) && sb->s_mtd) {
if (sbi && sbi->mtd_point_size)
mtd_unpoint(sb->s_mtd, 0, sbi->mtd_point_size);
- kill_mtd_super(sb);
+ put_mtd_device(sb->s_mtd);
+ sb->s_mtd = NULL;
} else if (IS_ENABLED(CONFIG_CRAMFS_BLOCKDEV) && sb->s_bdev) {
- kill_block_super(sb);
+ sb->s_bdev->bd_super = NULL;
+ sync_blockdev(sb->s_bdev);
+ blkdev_put(sb->s_bdev, sb->s_type);
}
kfree(sbi);
}