Skip to content

Commit

Permalink
Make abd_raidz_gen_iterate() pass an initialized pointer to the callback
Browse files Browse the repository at this point in the history
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 <[email protected]>
Reviewed-by: Allan Jude <[email protected]>
Reviewed-by: Brian Behlendorf <[email protected]>
Signed-off-by: Mark Johnston <[email protected]>
Closes #15491
  • Loading branch information
markjdb authored Nov 7, 2023
1 parent 358ce2c commit f4cd1ba
Showing 1 changed file with 6 additions and 3 deletions.
9 changes: 6 additions & 3 deletions module/zfs/abd.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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);
Expand All @@ -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]);
Expand Down

0 comments on commit f4cd1ba

Please sign in to comment.