CVE-2024-47679

Source
https://cve.org/CVERecord?id=CVE-2024-47679
Import Source
https://storage.googleapis.com/cve-osv-conversion/osv-output/CVE-2024-47679.json
JSON Data
https://api.osv.dev/v1/vulns/CVE-2024-47679
Downstream
Related
Published
2024-10-21T11:53:22.469Z
Modified
2026-04-02T12:20:16.234187Z
Summary
vfs: fix race between evice_inodes() and find_inode()&iput()
Details

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

vfs: fix race between eviceinodes() and findinode()&iput()

Hi, all

Recently I noticed a bug[1] in btrfs, after digged it into and I believe it'a race in vfs.

Let's assume there's a inode (ie ino 261) with icount 1 is called by iput(), and there's a concurrent thread calling genericshutdown_super().

cpu0: cpu1: iput() // icount is 1 ->spinlock(inode) ->dec icount to 0 ->iputfinal() genericshutdownsuper() ->__inodeaddlru() ->evictinodes() // cause some reason[2] ->if (atomicread(inode->icount)) continue; // return before // inode 261 passed the above check // listlruaddobj() // and then schedule out ->spinunlock() // note here: the inode 261 // was still at sb list and hash list, // and IFREEING|IWILLFREE was not been set

btrfsiget() // after some function calls ->findinode() // found the above inode 261 ->spinlock(inode) // check IFREEING|IWILLFREE // and passed ->__iget() ->spinunlock(inode) // schedule back ->spinlock(inode) // check (INEW|IFREEING|IWILLFREE) flags, // passed and set IFREEING iput() ->spinunlock(inode) ->spinlock(inode) ->evict() // dec icount to 0 ->iputfinal() ->spinunlock() ->evict()

Now, we have two threads simultaneously evicting the same inode, which may trigger the BUG(inode->istate & ICLEAR) statement both within clear_inode() and iput().

To fix the bug, recheck the inode->icount after holding ilock. Because in the most scenarios, the first check is valid, and the overhead of spin_lock() can be reduced.

If there is any misunderstanding, please let me know, thanks.

return false when I reproduced the bug.

Database specific
{
    "osv_generated_from": "https://github.com/CVEProject/cvelistV5/tree/main/cves/2024/47xxx/CVE-2024-47679.json",
    "cna_assigner": "Linux"
}
References

Affected packages

Git / git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git

Affected ranges

Type
GIT
Repo
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
Events
Introduced
63997e98a3be68d7cec806d22bf9b02b2e1daabb
Fixed
6cc13a80a26e6b48f78c725c01b91987d61563ef
Fixed
489faddb1ae75b0e1a741fe5ca2542a2b5e794a5
Fixed
47a68c75052a660e4c37de41e321582ec9496195
Fixed
3721a69403291e2514d13a7c3af50a006ea1153b
Fixed
540fb13120c9eab3ef203f90c00c8e69f37449d1
Fixed
0eed942bc65de1f93eca7bda51344290f9c573bb
Fixed
0f8a5b6d0dafa4f533ac82e98f8b812073a7c9d1
Fixed
6c857fb12b9137fee574443385d53914356bbe11
Fixed
88b1afbf0f6b221f6c5bb66cc80cd3b38d696687

Database specific

source
"https://storage.googleapis.com/cve-osv-conversion/osv-output/CVE-2024-47679.json"