CVE-2025-37904

btrfs: fix the inode leak in btrfs_iget()

published May 20, 2025

CVSS
—
EPSS
0%
Percentile
6.2
In the wild
Unconfirmed
What it is

In the Linux kernel, the following vulnerability has been resolved:

btrfs: fix the inode leak in btrfs_iget()

[BUG]

There is a bug report that a syzbot reproducer can lead to the following

busy inode at unmount time:

BTRFS info (device loop1): last unmount of filesystem 1680000e-3c1e-4c46-84b6-56bd3909af50

VFS: Busy inodes after unmount of loop1 (btrfs)

------------[ cut here ]------------

kernel BUG at fs/super.c:650!

Oops: invalid opcode: 0000 [#1] SMP KASAN NOPTI

CPU: 0 UID: 0 PID: 48168 Comm: syz-executor Not tainted 6.15.0-rc2-00471-g119009db2674 #2 PREEMPT(full)

Hardware name: QEMU Ubuntu 24.04 PC (i440FX + PIIX, 1996), BIOS 1.16.3-debian-1.16.3-2 04/01/2014

RIP: 0010:generic_shutdown_super+0x2e9/0x390 fs/super.c:650

Call Trace:

<TASK>

kill_anon_super+0x3a/0x60 fs/super.c:1237

btrfs_kill_super+0x3b/0x50 fs/btrfs/super.c:2099

deactivate_locked_super+0xbe/0x1a0 fs/super.c:473

deactivate_super fs/super.c:506 [inline]

deactivate_super+0xe2/0x100 fs/super.c:502

cleanup_mnt+0x21f/0x440 fs/namespace.c:1435

task_work_run+0x14d/0x240 kernel/task_work.c:227

resume_user_mode_work include/linux/resume_user_mode.h:50 [inline]

exit_to_user_mode_loop kernel/entry/common.c:114 [inline]

exit_to_user_mode_prepare include/linux/entry-common.h:329 [inline]

__syscall_exit_to_user_mode_work kernel/entry/common.c:207 [inline]

syscall_exit_to_user_mode+0x269/0x290 kernel/entry/common.c:218

do_syscall_64+0xd4/0x250 arch/x86/entry/syscall_64.c:100

entry_SYSCALL_64_after_hwframe+0x77/0x7f

</TASK>

[CAUSE]

When btrfs_alloc_path() failed, btrfs_iget() directly returned without

releasing the inode already allocated by btrfs_iget_locked().

This results the above busy inode and trigger the kernel BUG.

[FIX]

Fix it by calling iget_failed() if btrfs_alloc_path() failed.

If we hit error inside btrfs_read_locked_inode(), it will properly call

iget_failed(), so nothing to worry about.

Although the iget_failed() cleanup inside btrfs_read_locked_inode() is a

break of the normal error handling scheme, let's fix the obvious bug

and backport first, then rework the error handling later.

The record
Technical detail
CVSS
Not scored
CVSS v4.0
Not supplied
EPSS
0.00172 · 6.2th percentile
Published
2025-05-20T15:21Z
EPSS history
Timeline
  • 20 MAY 15:21Z
    btrfs: fix the inode leak in btrfs_iget()
    cvelistv5