From f4cd1bac723633a22adafc87c2a9f874fbcbc9d6 Mon Sep 17 00:00:00 2001 From: Mark Johnston Date: Tue, 7 Nov 2023 13:24:15 -0500 Subject: [PATCH] Make abd_raidz_gen_iterate() pass an initialized pointer to the callback Otherwise callbacks may trigger KMSAN violations in the dlen == 0 case. For example, raidz_syn_pq_abd() will compare an uninitialized pointer with itself before returning. This seems harmless, but let's maintain good hygiene and avoid passing uninitialized variables, if only to placate KMSAN. Reviewed-by: Alexander Motin Reviewed-by: Allan Jude Reviewed-by: Brian Behlendorf Signed-off-by: Mark Johnston Closes #15491 --- module/zfs/abd.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/module/zfs/abd.c b/module/zfs/abd.c index bcc6ddd5e8..0a2411a2d5 100644 --- a/module/zfs/abd.c +++ b/module/zfs/abd.c @@ -1025,7 +1025,7 @@ abd_raidz_gen_iterate(abd_t **cabds, abd_t *dabd, size_t off, size_t len, dlen; struct abd_iter caiters[3]; struct abd_iter daiter; - void *caddrs[3]; + void *caddrs[3], *daddr; unsigned long flags __maybe_unused = 0; abd_t *c_cabds[3]; abd_t *c_dabd = NULL; @@ -1057,10 +1057,13 @@ abd_raidz_gen_iterate(abd_t **cabds, abd_t *dabd, size_t off, if (dsize > 0) { IMPLY(abd_is_gang(dabd), c_dabd != NULL); abd_iter_map(&daiter); + daddr = daiter.iter_mapaddr; len = MIN(daiter.iter_mapsize, len); dlen = len; - } else + } else { + daddr = NULL; dlen = 0; + } /* must be progressive */ ASSERT3U(len, >, 0); @@ -1070,7 +1073,7 @@ abd_raidz_gen_iterate(abd_t **cabds, abd_t *dabd, size_t off, */ ASSERT3U(((uint64_t)len & 511ULL), ==, 0); - func_raidz_gen(caddrs, daiter.iter_mapaddr, len, dlen); + func_raidz_gen(caddrs, daddr, len, dlen); for (i = parity-1; i >= 0; i--) { abd_iter_unmap(&caiters[i]);