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]>