Re: [PATCH v2] md/raid5: fix possible null-pointer dereferences in raid5_store_group_thread_cnt()

Xiao Ni <[email protected]>
Newsgroups gmane.linux.raid,gmane.linux.kernel
Message-ID <CALTww28jT+FFcQda+08LNo1X5vo8F9jrsxSkK16gWcTwJR392w@mail.gmail.com>
On Thu, Dec 25, 2025 at 9:04 PM Tuo Li <[email protected]> wrote:
>
> The variable mddev->private is first assigned to conf and then checked:
>
>    conf = mddev->private;
>     if (!conf) ...
>
> If conf is NULL, then mddev->private is also NULL. In this case,
> null-pointer dereferences can occur when calling raid5_quiesce():
>
>   raid5_quiesce(mddev, true);
>   raid5_quiesce(mddev, false);
>
> since mddev->private is assigned to conf again in raid5_quiesce(), and conf
> is dereferenced in several places, for example:
>
>   conf->quiesce = 0;
>   wake_up(&conf->wait_for_quiescent);
>
> To fix this issue, the function should unlock mddev and return before
> invoking raid5_quiesce() when conf is NULL, following the existing pattern
> in raid5_change_consistency_policy().
>
> Fixes: fa1944bbe622 ("md/raid5: Wait sync io to finish before changing group cnt")
> Signed-off-by: Tuo Li <[email protected]>
> ---
> v2:
> * Move the NULL check and early return ahead of the first call to
>   raid5_quiesce().
>   Thanks to Yu Kuai for helpful advice.
> ---
>  drivers/md/raid5.c | 10 ++++++----
>  1 file changed, 6 insertions(+), 4 deletions(-)
>
> diff --git a/drivers/md/raid5.c b/drivers/md/raid5.c
> index e57ce3295292..8dc98f545969 100644
> --- a/drivers/md/raid5.c
> +++ b/drivers/md/raid5.c
> @@ -7187,12 +7187,14 @@ raid5_store_group_thread_cnt(struct mddev *mddev, const char *page, size_t len)
>         err = mddev_suspend_and_lock(mddev);
>         if (err)
>                 return err;
> +       conf = mddev->private;
> +       if (!conf) {
> +               mddev_unlock_and_resume(mddev);
> +               return -ENODEV;
> +       }
>         raid5_quiesce(mddev, true);
>
> -       conf = mddev->private;
> -       if (!conf)
> -               err = -ENODEV;
> -       else if (new != conf->worker_cnt_per_group) {
> +       if (new != conf->worker_cnt_per_group) {
>                 old_groups = conf->worker_groups;
>                 if (old_groups)
>                         flush_workqueue(raid5_wq);
> --
> 2.43.0
>
>

Thanks for the patch. It looks good to me.

Reviewed-by: Xiao Ni <[email protected]>
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.