]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
btrfs: Check if item pointer overlaps with the item itself
authorQu Wenruo <quwenruo.btrfs@gmx.com>
Wed, 23 Aug 2017 07:57:57 +0000 (16:57 +0900)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 5 Dec 2018 18:41:11 +0000 (19:41 +0100)
commit 7f43d4affb2a254d421ab20b0cf65ac2569909fb upstream.

Function check_leaf() checks if any item pointer points outside of the
leaf, but it doesn't check if the pointer overlaps with the item itself.

Normally only the last item may be the victim, but adding such check is
never a bad idea anyway.

Signed-off-by: Qu Wenruo <quwenruo.btrfs@gmx.com>
Reviewed-by: Nikolay Borisov <nborisov@suse.com>
Reviewed-by: David Sterba <dsterba@suse.com>
Signed-off-by: David Sterba <dsterba@suse.com>
Signed-off-by: Ben Hutchings <ben.hutchings@codethink.co.uk>
Signed-off-by: Sasha Levin <sashal@kernel.org>
fs/btrfs/disk-io.c

index 4a1e63df1183b99fa9c37d3752b4c34eb722ba1b..da7b2039e4cb33e4db0ebac7c14bbafcf82352be 100644 (file)
@@ -644,6 +644,13 @@ static noinline int check_leaf(struct btrfs_root *root,
                        return -EUCLEAN;
                }
 
+               /* Also check if the item pointer overlaps with btrfs item. */
+               if (btrfs_item_nr_offset(slot) + sizeof(struct btrfs_item) >
+                   btrfs_item_ptr_offset(leaf, slot)) {
+                       CORRUPT("slot overlap with its data", leaf, root, slot);
+                       return -EUCLEAN;
+               }
+
                prev_key.objectid = key.objectid;
                prev_key.type = key.type;
                prev_key.offset = key.offset;