Overview
About vulnerability
In the Linux kernel, the following vulnerability has been resolved:
md-cluster: fix NULL pointer dereference in process_metadata_update
The function process_metadata_update() blindly dereferences the ’thread' pointer (acquired via rcu_dereference_protected) within the wait_event() macro.
While the code comment states “daemon thread must exist”, there is a valid race condition window during the MD array startup sequence (md_run):
- bitmap_load() is called, which invokes md_cluster_ops->join().
- join() starts the “cluster_recv” thread (recv_daemon).
- At this point, recv_daemon is active and processing messages.
- However, mddev->thread (the main MD thread) is not initialized until later in md_run().
If a METADATA_UPDATED message is received from a remote node during this specific window, process_metadata_update() will be called while mddev->thread is still NULL, leading to a kernel panic.
To fix this, we must validate the ’thread’ pointer. If it is NULL, we release the held lock (no_new_dev_lockres) and return early, safely ignoring the update request as the array is not yet fully ready to process it.
Details
- Affected product:
- AlmaLinux 9.2 ESU , CentOS 8.4 ELS , CentOS 8.5 ELS , CentOS Stream 8 ELS , Oracle Linux 7 ELS , TuxCare 9.6 ESU , Ubuntu 16.04 ELS , Ubuntu 18.04 ELS , Ubuntu 20.04 ELS
- Affected packages:
- kernel @ 4.18.0 (+8 more)
In the Linux kernel, the following vulnerability has been resolved:
md-cluster: fix NULL pointer dereference in process_metadata_update
The function process_metadata_update() blindly dereferences the ’thread' pointer (acquired via rcu_dereference_protected) within the wait_event() macro.
While the code comment states “daemon thread must exist”, there is a valid race condition window during the MD array startup sequence (md_run):
- bitmap_load() is called, which invokes md_cluster_ops->join().
- join() starts the “cluster_recv” thread (recv_daemon).
- At this point, recv_daemon is active and processing messages.
- However, mddev->thread (the main MD thread) is not initialized until later in md_run().
If a METADATA_UPDATED message is received from a remote node during this specific window, process_metadata_update() will be called while mddev->thread is still NULL, leading to a kernel panic.
To fix this, we must validate the ’thread’ pointer. If it is NULL, we release the held lock (no_new_dev_lockres) and return early, safely ignoring the update request as the array is not yet fully ready to process it.