Description
In the Linux kernel, the following vulnerability has been resolved: fuse: fix invalidate lock leak on open O_TRUNC DAX failure fuse_open() takes filemap_invalidate_lock() for a DAX truncate (dax_truncate = true) and releases it before the out_inode_unlock label. But when fuse_dax_break_layouts() fails, the goto out_inode_unlock skips the unlock and leaks the rwsem, so any later fault or truncate on the file stalls on the stale lock. fuse_dax_break_layouts() can fail with -ERESTARTSYS when a signal interrupts the wait for busy DAX pages to drain: open("file", O_RDWR | O_TRUNC) └─ fuse_open() ├─ filemap_invalidate_lock() # dax_truncate └─ fuse_dax_break_layouts() └─ dax_break_layout() └─ wait_page_idle() # TASK_INTERRUPTIBLE └─ fuse_wait_dax_page() # unlock, schedule, re-lock └─ signal → -ERESTARTSYS goto out_inode_unlock # <- lock leaked Fix this by moving filemap_invalidate_unlock() below the label so that all error paths release the lock, and rename the label to out_unlock as it now covers more than just the inode lock.
Affected products
Version statuses are supplied by the assigning organization. Consult the original record for detailed ranges and platform conditions.
Linux Linux
Default version status: unaffected
81775ab858b4236c52c5da7e25cec6e49dd91b46 to < 69a294e561c10909688bcb25456535dcd1818e1aaffectedd58366aab86854217b81679d1a9dcd54a2edfc2a to < 1b04d80a27d317064cce2307472f5bef9975bc50affected2fdbb8dd01556e1501132b5ad3826e8f71e24a8b to < a61524da59a2f5ac9c8de23ff98b30da769ab144affected2fdbb8dd01556e1501132b5ad3826e8f71e24a8b to < dcf30a56624c2a0cfab1bada5b1ca8cc0c02f010affected2fdbb8dd01556e1501132b5ad3826e8f71e24a8b to < 7288c279ddbd654a06c82118c1a3f5570c1807f0affected2fdbb8dd01556e1501132b5ad3826e8f71e24a8b to < 776e85fda752f9a15e0f82dec42ecacd12a9bd94affected2fdbb8dd01556e1501132b5ad3826e8f71e24a8b to < 1d3e701cda2f41d48aa721b3ebefbe0fbf8d74daaffected2fdbb8dd01556e1501132b5ad3826e8f71e24a8b to < e981474d7bf1457da12404e169ea147d2c8ecea7affected2fdbb8dd01556e1501132b5ad3826e8f71e24a8b to < a927f1867e61b78f39f9da0bbba3c98c2ca151feaffectedb57e150ac2eac791d5d187923b73dc2dafaf67faaffected1fdbbe246daf348adaa0739463384b16ceba1fc0affected5.10.179 to < 5.10.273affected5.15.109 to < 5.15.220affected5.18.18 to < 5.19affected5.19.2 to < 5.20affected
Linux Linux
Default version status: affected
6.0affected0 to < 6.0unaffected5.10.273 to ≤ 5.10.*unaffected5.15.220 to ≤ 5.15.*unaffected6.1.187 to ≤ 6.1.*unaffected6.6.156 to ≤ 6.6.*unaffected6.12.108 to ≤ 6.12.*unaffected6.18.49 to ≤ 6.18.*unaffected7.1.13 to ≤ 7.1.*unaffected7.2.3 to ≤ 7.2.*unaffected7.3 to ≤ *unaffected
References
- https://git.kernel.org/stable/c/69a294e561c10909688bcb25456535dcd1818e1a ↗
- https://git.kernel.org/stable/c/1b04d80a27d317064cce2307472f5bef9975bc50 ↗
- https://git.kernel.org/stable/c/a61524da59a2f5ac9c8de23ff98b30da769ab144 ↗
- https://git.kernel.org/stable/c/dcf30a56624c2a0cfab1bada5b1ca8cc0c02f010 ↗
- https://git.kernel.org/stable/c/7288c279ddbd654a06c82118c1a3f5570c1807f0 ↗
- https://git.kernel.org/stable/c/776e85fda752f9a15e0f82dec42ecacd12a9bd94 ↗
- https://git.kernel.org/stable/c/1d3e701cda2f41d48aa721b3ebefbe0fbf8d74da ↗
- https://git.kernel.org/stable/c/e981474d7bf1457da12404e169ea147d2c8ecea7 ↗
- https://git.kernel.org/stable/c/a927f1867e61b78f39f9da0bbba3c98c2ca151fe ↗