Commit a405c6f
md/raid10: fix null-ptr-deref in raid10_sync_request
init_resync() inits mempool and sets conf->have_replacemnt at the beginning
of sync, close_sync() frees the mempool when sync is completed.
After [1] recovery might be skipped and init_resync() is called but
close_sync() is not. null-ptr-deref occurs with r10bio->dev[i].repl_bio.
The following is one way to reproduce the issue.
1) create a array, wait for resync to complete, mddev->recovery_cp is set
to MaxSector.
2) recovery is woken and it is skipped. conf->have_replacement is set to
0 in init_resync(). close_sync() not called.
3) some io errors and rdev A is set to WantReplacement.
4) a new device is added and set to A's replacement.
5) recovery is woken, A have replacement, but conf->have_replacemnt is
0. r10bio->dev[i].repl_bio will not be alloced and null-ptr-deref
occurs.
Fix it by not calling init_resync() if recovery skipped.
[1] commit 7e83ccb ("md/raid10: Allow skipping recovery when clean arrays are assembled")
Fixes: 7e83ccb ("md/raid10: Allow skipping recovery when clean arrays are assembled")
Cc: stable@vger.kernel.org
Signed-off-by: Li Nan <linan122@huawei.com>
Signed-off-by: Song Liu <song@kernel.org>
Link: https://lore.kernel.org/r/20230222041000.3341651-3-linan666@huaweicloud.com1 parent 72c215e commit a405c6f
1 file changed
Lines changed: 4 additions & 4 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
3297 | 3297 | | |
3298 | 3298 | | |
3299 | 3299 | | |
3300 | | - | |
3301 | | - | |
3302 | | - | |
3303 | | - | |
3304 | 3300 | | |
3305 | 3301 | | |
3306 | 3302 | | |
| |||
3316 | 3312 | | |
3317 | 3313 | | |
3318 | 3314 | | |
| 3315 | + | |
| 3316 | + | |
| 3317 | + | |
| 3318 | + | |
3319 | 3319 | | |
3320 | 3320 | | |
3321 | 3321 | | |
| |||
0 commit comments