]> git.proxmox.com Git - mirror_zfs.git/commitdiff
make zdb_decompress_block check decompression reliably
authorKent Ross <k@mad.cash>
Tue, 9 Jan 2024 17:13:52 +0000 (09:13 -0800)
committerGitHub <noreply@github.com>
Tue, 9 Jan 2024 17:13:52 +0000 (09:13 -0800)
This function decompresses to two buffers and then compares them to
check whether the (opaque) decompression process filled the whole
buffer. Previously it began with lbuf uninitialized and lbuf2 filled
with pseudorandom data. This neither guarantees that any bytes not
written by the compressor would be different, nor seems incredibly
sound otherwise!

After these changes, instead of filling one buffer with generated
pseudorandom data we overwrite each buffer with completely different
data. This should remove the possibility of low-probability failures,
as well as make the process simpler and cheaper.

Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov>
Reviewed-by: Rich Ercolani <rincebrain@gmail.com>
Signed-off-by: Kent Ross <k@mad.cash>
Closes #15733

cmd/zdb/zdb.c

index 777032bf82f68c85fc048894b6676249d0e458d6..cd934b2ae9ade233089d976bd58767dad7bc927c 100644 (file)
@@ -8533,11 +8533,14 @@ zdb_decompress_block(abd_t *pabd, void *buf, void *lbuf, uint64_t lsize,
                        }
 
                        /*
-                        * We randomize lbuf2, and decompress to both
-                        * lbuf and lbuf2. This way, we will know if
-                        * decompression fill exactly to lsize.
+                        * We set lbuf to all zeros and lbuf2 to all
+                        * ones, then decompress to both buffers and
+                        * compare their contents. This way we can
+                        * know if decompression filled exactly to
+                        * lsize or if it left some bytes unwritten.
                         */
-                       VERIFY0(random_get_pseudo_bytes(lbuf2, lsize));
+                       memset(lbuf, 0x00, lsize);
+                       memset(lbuf2, 0xff, lsize);
 
                        if (zio_decompress_data(*cfuncp, pabd,
                            lbuf, psize, lsize, NULL) == 0 &&