xfs: check dabtree node hash values when loading child blocks
authorDarrick J. Wong <darrick.wong@oracle.com>
Mon, 21 Sep 2020 16:15:09 +0000 (09:15 -0700)
committerDarrick J. Wong <darrick.wong@oracle.com>
Wed, 23 Sep 2020 15:58:51 +0000 (08:58 -0700)
When xchk_da_btree_block is loading a non-root dabtree block, we know
that the parent block had to have a (hashval, address) pointer to the
block that we just loaded.  Check that the hashval in the parent matches
the block we just loaded.

This was found by fuzzing nbtree[3].hashval = ones in xfs/394.

Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
Reviewed-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: Dave Chinner <dchinner@redhat.com>
fs/xfs/scrub/dabtree.c

index e56786f..653f328 100644 (file)
@@ -441,6 +441,20 @@ xchk_da_btree_block(
                goto out_freebp;
        }
 
+       /*
+        * If we've been handed a block that is below the dabtree root, does
+        * its hashval match what the parent block expected to see?
+        */
+       if (level > 0) {
+               struct xfs_da_node_entry        *key;
+
+               key = xchk_da_btree_node_entry(ds, level - 1);
+               if (be32_to_cpu(key->hashval) != blk->hashval) {
+                       xchk_da_set_corrupt(ds, level);
+                       goto out_freebp;
+               }
+       }
+
 out:
        return error;
 out_freebp: