Fix zdb -E segfault

SPA_MAXBLOCKSIZE is too large for stack.

Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov>
Reviewed-by: loli10K <ezomori.nozomu@gmail.com>
Signed-off-by: Chunwei Chen <david.chen@nutanix.com>
Closes #7099
This commit is contained in:
Chunwei Chen 2018-02-01 16:28:11 -08:00 committed by Tony Hutter
parent 18c662b845
commit 31ff122aa2

View File

@ -4139,11 +4139,12 @@ zdb_embedded_block(char *thing)
{ {
blkptr_t bp; blkptr_t bp;
unsigned long long *words = (void *)&bp; unsigned long long *words = (void *)&bp;
char buf[SPA_MAXBLOCKSIZE]; char *buf;
int err; int err;
memset(&bp, 0, sizeof (blkptr_t)); buf = umem_alloc(SPA_MAXBLOCKSIZE, UMEM_NOFAIL);
bzero(&bp, sizeof (bp));
err = sscanf(thing, "%llx:%llx:%llx:%llx:%llx:%llx:%llx:%llx:" err = sscanf(thing, "%llx:%llx:%llx:%llx:%llx:%llx:%llx:%llx:"
"%llx:%llx:%llx:%llx:%llx:%llx:%llx:%llx", "%llx:%llx:%llx:%llx:%llx:%llx:%llx:%llx",
words + 0, words + 1, words + 2, words + 3, words + 0, words + 1, words + 2, words + 3,
@ -4161,6 +4162,7 @@ zdb_embedded_block(char *thing)
exit(1); exit(1);
} }
zdb_dump_block_raw(buf, BPE_GET_LSIZE(&bp), 0); zdb_dump_block_raw(buf, BPE_GET_LSIZE(&bp), 0);
umem_free(buf, SPA_MAXBLOCKSIZE);
} }
int int