]> granicus.if.org Git - zfs/commitdiff
Fix zdb -E segfault
authorChunwei Chen <david.chen@nutanix.com>
Fri, 2 Feb 2018 00:28:11 +0000 (16:28 -0800)
committerTony Hutter <hutter2@llnl.gov>
Wed, 14 Mar 2018 23:10:36 +0000 (16:10 -0700)
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

cmd/zdb/zdb.c

index 2d80589cafc07eaa011835033bade3d1a682d2be..90847d8d991c77634b6408fdc8ccb297faf93105 100644 (file)
@@ -4139,11 +4139,12 @@ zdb_embedded_block(char *thing)
 {
        blkptr_t bp;
        unsigned long long *words = (void *)&bp;
-       char buf[SPA_MAXBLOCKSIZE];
+       char *buf;
        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:"
            "%llx:%llx:%llx:%llx:%llx:%llx:%llx:%llx",
            words + 0, words + 1, words + 2, words + 3,
@@ -4161,6 +4162,7 @@ zdb_embedded_block(char *thing)
                exit(1);
        }
        zdb_dump_block_raw(buf, BPE_GET_LSIZE(&bp), 0);
+       umem_free(buf, SPA_MAXBLOCKSIZE);
 }
 
 int