All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH v2] fs/hfs: fix s_fs_info leak on setup_bdev_super() failure
@ 2025-11-19  7:38 Mehdi Ben Hadj Khelifa
  2025-11-19 14:14 ` Christian Brauner
  2025-11-19 19:58 ` Viacheslav Dubeyko
  0 siblings, 2 replies; 35+ messages in thread
From: Mehdi Ben Hadj Khelifa @ 2025-11-19  7:38 UTC (permalink / raw)
  To: slava, glaubitz, frank.li, brauner, jack, viro
  Cc: linux-fsdevel, linux-kernel, skhan, david.hunter.linux, khalid,
	linux-kernel-mentees, Mehdi Ben Hadj Khelifa,
	syzbot+ad45f827c88778ff7df6

The regression introduced by commit aca740cecbe5 ("fs: open block device
after superblock creation") allows setup_bdev_super() to fail after a new
superblock has been allocated by sget_fc(), but before hfs_fill_super()
takes ownership of the filesystem-specific s_fs_info data.

In that case, hfs_put_super() and the failure paths of hfs_fill_super()
are never reached, leaving the HFS mdb structures attached to s->s_fs_info
unreleased.The default kill_block_super() teardown also does not free 
HFS-specific resources, resulting in a memory leak on early mount failure.

Fix this by moving all HFS-specific teardown (hfs_mdb_put()) from
hfs_put_super() and the hfs_fill_super() failure path into a dedicated
hfs_kill_sb() implementation. This ensures that both normal unmount and
early teardown paths (including setup_bdev_super() failure) correctly
release HFS metadata.

This also preserves the intended layering: generic_shutdown_super()
handles VFS-side cleanup, while HFS filesystem state is fully destroyed
afterwards.

Fixes: aca740cecbe5 ("fs: open block device after superblock creation")
Reported-by: syzbot+ad45f827c88778ff7df6@syzkaller.appspotmail.com
Closes: https://syzkaller.appspot.com/bug?extid=ad45f827c88778ff7df6
Tested-by: syzbot+ad45f827c88778ff7df6@syzkaller.appspotmail.com
Suggested-by: Al Viro <viro@zeniv.linux.org.uk>
Signed-off-by: Mehdi Ben Hadj Khelifa <mehdi.benhadjkhelifa@gmail.com>
---
ChangeLog:

Changes from v1:

-Changed the patch direction to focus on hfs changes specifically as 
suggested by al viro

Link:https://lore.kernel.org/all/20251114165255.101361-1-mehdi.benhadjkhelifa@gmail.com/

Note:This patch might need some more testing as I only did run selftests 
with no regression, check dmesg output for no regression, run reproducer 
with no bug and test it with syzbot as well.

 fs/hfs/super.c | 16 ++++++++++++----
 1 file changed, 12 insertions(+), 4 deletions(-)

diff --git a/fs/hfs/super.c b/fs/hfs/super.c
index 47f50fa555a4..06e1c25e47dc 100644
--- a/fs/hfs/super.c
+++ b/fs/hfs/super.c
@@ -49,8 +49,6 @@ static void hfs_put_super(struct super_block *sb)
 {
 	cancel_delayed_work_sync(&HFS_SB(sb)->mdb_work);
 	hfs_mdb_close(sb);
-	/* release the MDB's resources */
-	hfs_mdb_put(sb);
 }
 
 static void flush_mdb(struct work_struct *work)
@@ -383,7 +381,6 @@ static int hfs_fill_super(struct super_block *sb, struct fs_context *fc)
 bail_no_root:
 	pr_err("get root inode failed\n");
 bail:
-	hfs_mdb_put(sb);
 	return res;
 }
 
@@ -431,10 +428,21 @@ static int hfs_init_fs_context(struct fs_context *fc)
 	return 0;
 }
 
+static void hfs_kill_sb(struct super_block *sb)
+{
+	generic_shutdown_super(sb);
+	hfs_mdb_put(sb);
+	if (sb->s_bdev) {
+		sync_blockdev(sb->s_bdev);
+		bdev_fput(sb->s_bdev_file);
+	}
+
+}
+
 static struct file_system_type hfs_fs_type = {
 	.owner		= THIS_MODULE,
 	.name		= "hfs",
-	.kill_sb	= kill_block_super,
+	.kill_sb	= hfs_kill_sb,
 	.fs_flags	= FS_REQUIRES_DEV,
 	.init_fs_context = hfs_init_fs_context,
 };
-- 
2.52.0


^ permalink raw reply related	[flat|nested] 35+ messages in thread

end of thread, other threads:[~2026-01-20 12:52 UTC | newest]

Thread overview: 35+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-11-19  7:38 [PATCH v2] fs/hfs: fix s_fs_info leak on setup_bdev_super() failure Mehdi Ben Hadj Khelifa
2025-11-19 14:14 ` Christian Brauner
2025-11-19 15:27   ` Mehdi Ben Hadj Khelifa
2025-11-19 19:58 ` Viacheslav Dubeyko
2025-11-19 22:21   ` Mehdi Ben Hadj Khelifa
2025-11-19 22:24     ` Mehdi Ben Hadj Khelifa
2025-11-21 19:44   ` Mehdi Ben Hadj Khelifa
2025-11-21 21:15     ` Viacheslav Dubeyko
2025-11-21 22:48       ` Mehdi Ben Hadj Khelifa
2025-11-21 22:04         ` Viacheslav Dubeyko
2025-11-21 23:16           ` Mehdi Ben Hadj Khelifa
2025-11-21 22:28             ` Viacheslav Dubeyko
2025-11-21 23:36               ` Mehdi Ben Hadj Khelifa
2025-11-21 23:01                 ` Viacheslav Dubeyko
2025-11-25 22:14                   ` Mehdi Ben Hadj Khelifa
2025-11-25 22:36                     ` Viacheslav Dubeyko
2025-11-27 17:45                     ` David Hunter
2025-11-29 13:06                       ` Mehdi Ben Hadj Khelifa
2025-11-26 13:48   ` Christian Brauner
2025-11-26 16:06     ` Mehdi Ben Hadj Khelifa
2025-11-26 22:30       ` Viacheslav Dubeyko
2025-11-27  8:59         ` Christian Brauner
2025-11-27 20:19           ` Viacheslav Dubeyko
2025-11-29 12:48             ` Mehdi Ben Hadj Khelifa
2025-12-01 19:24               ` Viacheslav Dubeyko
2025-12-01 21:19                 ` Mehdi Ben Hadj Khelifa
2025-12-01 20:37                   ` Viacheslav Dubeyko
2025-12-01 21:57                     ` Mehdi Ben Hadj Khelifa
2026-01-17 18:51                 ` Mehdi Ben Hadj Khelifa
2026-01-19 17:48                   ` Viacheslav Dubeyko
2026-01-19 19:03                     ` Mehdi Ben Hadj Khelifa
2026-01-19 18:27                       ` Viacheslav Dubeyko
2026-01-19 21:34                         ` Mehdi Ben Hadj Khelifa
2026-01-19 20:55                           ` Viacheslav Dubeyko
2026-01-20 13:52                             ` Mehdi Ben Hadj Khelifa

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.