Medium · published October 9, 2024
In the Linux kernel, the following vulnerability has been resolved:
fsnotify: clear PARENT_WATCHED flags lazily
In some setups directories can have many (usually negative) dentries.
Hence __fsnotify_update_child_dentry_flags() function can take a
significant amount of time. Since the bulk of this function happens
under inode->i_lock this causes a significant contention on the lock
when we remove the watch from the directory as the
__fsnotify_update_child_dentry_flags() call from fsnotify_recalc_mask()
races with __fsnotify_update_child_dentry_flags() calls from
__fsnotify_parent() happening on children. This can lead upto softlockup
reports reported by users.
Fix the problem by calling fsnotify_update_children_dentry_flags() to
set PARENT_WATCHED flags only when parent starts watching children.
When parent stops watching children, clear false positive PARENT_WATCHED
flags lazily in __fsnotify_parent() for each accessed child.
| Product | Versions | Fixed in |
|---|---|---|
| linux/linux_kernel | < 5.10.226 | 5.10.226 |
| linux/linux_kernel | ≥ 5.11, < 5.15.167 | 5.15.167 |
| linux/linux_kernel | ≥ 5.16, < 6.1.109 | 6.1.109 |
| linux/linux_kernel | ≥ 6.2, < 6.6.50 | 6.6.50 |
| linux/linux_kernel | ≥ 6.7, < 6.10.9 | 6.10.9 |