ocfs2: fix missing metadata reservation for large xattrs
- Published
- Last modified
- Where the record stands: published, rejected by its publisher, or superseded by another id.What do these mean? →
- published
- Whether CISA lists it in its Known Exploited Vulnerabilities catalog: proof that attackers are using it.What do these mean? →
- Not listed in CISA KEV
- Fix
- Fixed in 2.6.35, 5.10.267, 5.15.218, 6.1.185, 6.6.154, and 4 more
- Whether working attack code is public (Exploit-DB, Metasploit, Nuclei or GitHub). Public code makes attacks easier.What do these mean? →
- None on Exploit-DB, Metasploit or GitHub
Summary
In the Linux kernel, the following vulnerability has been resolved: ocfs2: fix missing metadata reservation for large xattrs [BUG] lsetxattr() panics the kernel when setting a large xattr value on a fragmented filesystem where the file already has an external xattr block. [CAUSE] ocfs2_calc_xattr_set_need() never reserves metadata blocks for a new xattr value's extent tree when the file already has an external xattr block. The not_found path leaves meta_add at zero, so meta_ac is NULL when ocfs2_xattr_extend_allocation() runs. A new value root has room for a single extent record. On a fragmented filesystem, the allocator cannot satisfy the xattr value in one contiguous run, so each non-contiguous run requires its own extent record. When the value root's extent list is full and meta_ac is NULL, ocfs2_add_clusters_in_btree() returns RESTART_META, and ocfs2_xattr_extend_allocation() hits BUG_ON(why == RESTART_META). [FIX] The case where no xattr block exists yet already calls ocfs2_extend_meta_needed(&def_xv.xv.xr_list) to reserve value tree metadata. Add the same reservation to the case where an xattr block already exists, making the two cases consistent. Replace the BUG_ON with a -ENOSPC return so that if RESTART_META is returned despite the reservation, the error propagates to userspace instead of panicking the kernel.
Timeline
- CVE published
- Record last updated
Affected versions
- Linux Linux
From a78f9f4668949a6588b8872f162e86685c63d023 · fixed in 743ac908282ac97ef6e73ac3a92df2cc8ecb7479; From a78f9f4668949a6588b8872f162e86685c63d023 · fixed in 04ba24bce61c917b5b3009f0db470cbb72e26a0d; From a78f9f4668949a6588b8872f162e86685c63d023 · fixed in b4663405ae29d36011cd712d243456f3f9ab700d; From a78f9f4668949a6588b8872f162e86685c63d023 · fixed in 6a009f1e61b11d9e23d3c5aa1dacfb010945da45; From a78f9f4668949a6588b8872f162e86685c63d023 · fixed in b9eb5c9fdd81d82976d4d5be2b2458eb7d7e46ec; From a78f9f4668949a6588b8872f162e86685c63d023 · fixed in 6176313622e34fa3e2b66b9d0682d1e1c6b365c5; From a78f9f4668949a6588b8872f162e86685c63d023 · fixed in a3ccb57086dd7652d5ecb826486144198a98a8e9; From a78f9f4668949a6588b8872f162e86685c63d023 · fixed in 50f0cbec45b0f3fd7e1263d01916518dbf31eb3f; From a78f9f4668949a6588b8872f162e86685c63d023 · fixed in 0cdc7dde00ec63ac714271fa8b2918d630b8da1a; From 2.6.34.2 · fixed in 2.6.35
- Linux Linux
2.6.35
- KernelLinux
From 2.6.35 · fixed in 5.10.267; From 5.11.0 · fixed in 5.15.218; From 5.16.0 · fixed in 6.1.185; From 6.2.0 · fixed in 6.6.154; From 6.7.0 · fixed in 6.12.106; From 6.13.0 · fixed in 6.18.47; From 6.19.0 · fixed in 7.1.11; From 7.2.0 · fixed in 7.2.1
References 9
git.kernel.org
- stable/c/743ac908282ac97ef6e73ac3a92df2cc8ecb7479
- stable/c/04ba24bce61c917b5b3009f0db470cbb72e26a0d
- stable/c/b4663405ae29d36011cd712d243456f3f9ab700d
- stable/c/6a009f1e61b11d9e23d3c5aa1dacfb010945da45
- stable/c/b9eb5c9fdd81d82976d4d5be2b2458eb7d7e46ec
- stable/c/6176313622e34fa3e2b66b9d0682d1e1c6b365c5
- stable/c/a3ccb57086dd7652d5ecb826486144198a98a8e9
- stable/c/50f0cbec45b0f3fd7e1263d01916518dbf31eb3f
- stable/c/0cdc7dde00ec63ac714271fa8b2918d630b8da1a