xfs: detect overflows in bmbt records
authorDarrick J. Wong <darrick.wong@oracle.com>
Wed, 2 Dec 2020 20:25:43 +0000 (12:25 -0800)
committerDarrick J. Wong <darrick.wong@oracle.com>
Wed, 9 Dec 2020 17:49:38 +0000 (09:49 -0800)
Detect file block mappings with a blockcount that's either so large that
integer overflows occur or are zero, because neither are valid in the
filesystem.  Worse yet, attempting directory modifications causes the
iext code to trip over the bmbt key handling and takes the filesystem
down.  We can fix most of this by preventing the bad metadata from
entering the incore structures in the first place.

Found by setting blockcount=0 in a directory data fork mapping and
watching the fireworks.

Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
Reviewed-by: Christoph Hellwig <hch@lst.de>
fs/xfs/libxfs/xfs_bmap.c

index d9a692484eaed2e2e363b0920f70e7b70996654b..de9c27ef68d861d7de6a81c706a2b48d7f165220 100644 (file)
@@ -6229,6 +6229,11 @@ xfs_bmap_validate_extent(
        xfs_fsblock_t           endfsb;
        bool                    isrt;
 
+       if (irec->br_startblock + irec->br_blockcount <= irec->br_startblock)
+               return __this_address;
+       if (irec->br_startoff + irec->br_blockcount <= irec->br_startoff)
+               return __this_address;
+
        isrt = XFS_IS_REALTIME_INODE(ip);
        endfsb = irec->br_startblock + irec->br_blockcount - 1;
        if (isrt && whichfork == XFS_DATA_FORK) {