linux/fs/xfs/libxfs
Dave Chinner 837514f7a4 xfs: fix overflow in xfs_attr3_leaf_verify
generic/070 on 64k block size filesystems is failing with a verifier
corruption on writeback or an attribute leaf block:

[   94.973083] XFS (pmem0): Metadata corruption detected at xfs_attr3_leaf_verify+0x246/0x260, xfs_attr3_leaf block 0x811480
[   94.975623] XFS (pmem0): Unmount and run xfs_repair
[   94.976720] XFS (pmem0): First 128 bytes of corrupted metadata buffer:
[   94.978270] 000000004b2e7b45: 00 00 00 00 00 00 00 00 3b ee 00 00 00 00 00 00  ........;.......
[   94.980268] 000000006b1db90b: 00 00 00 00 00 81 14 80 00 00 00 00 00 00 00 00  ................
[   94.982251] 00000000433f2407: 22 7b 5c 82 2d 5c 47 4c bb 31 1c 37 fa a9 ce d6  "{\.-\GL.1.7....
[   94.984157] 0000000010dc7dfb: 00 00 00 00 00 81 04 8a 00 0a 18 e8 dd 94 01 00  ................
[   94.986215] 00000000d5a19229: 00 a0 dc f4 fe 98 01 68 f0 d8 07 e0 00 00 00 00  .......h........
[   94.988171] 00000000521df36c: 0c 2d 32 e2 fe 20 01 00 0c 2d 58 65 fe 0c 01 00  .-2.. ...-Xe....
[   94.990162] 000000008477ae06: 0c 2d 5b 66 fe 8c 01 00 0c 2d 71 35 fe 7c 01 00  .-[f.....-q5.|..
[   94.992139] 00000000a4a6bca6: 0c 2d 72 37 fc d4 01 00 0c 2d d8 b8 f0 90 01 00  .-r7.....-......
[   94.994789] XFS (pmem0): xfs_do_force_shutdown(0x8) called from line 1453 of file fs/xfs/xfs_buf.c. Return address = ffffffff815365f3

This is failing this check:

                end = ichdr.freemap[i].base + ichdr.freemap[i].size;
                if (end < ichdr.freemap[i].base)
>>>>>                   return __this_address;
                if (end > mp->m_attr_geo->blksize)
                        return __this_address;

And from the buffer output above, the freemap array is:

	freemap[0].base = 0x00a0
	freemap[0].size = 0xdcf4	end = 0xdd94
	freemap[1].base = 0xfe98
	freemap[1].size = 0x0168	end = 0x10000
	freemap[2].base = 0xf0d8
	freemap[2].size = 0x07e0	end = 0xf8b8

These all look valid - the block size is 0x10000 and so from the
last check in the above verifier fragment we know that the end
of freemap[1] is valid. The problem is that end is declared as:

	uint16_t	end;

And (uint16_t)0x10000 = 0. So we have a verifier bug here, not a
corruption. Fix the verifier to use uint32_t types for the check and
hence avoid the overflow.

Fixes: https://bugzilla.kernel.org/show_bug.cgi?id=201577
Signed-off-by: Dave Chinner <dchinner@redhat.com>
Reviewed-by: Darrick J. Wong <darrick.wong@oracle.com>
Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
2018-11-06 07:50:50 -08:00
..
xfs_ag_resv.c xfs: pass transaction lock while setting up agresv on cyclic metadata 2018-07-29 22:37:08 -07:00
xfs_ag_resv.h xfs: pass transaction lock while setting up agresv on cyclic metadata 2018-07-29 22:37:08 -07:00
xfs_ag.c xfs: factor the ag length extension code into libxfs 2018-05-15 18:12:51 -07:00
xfs_ag.h xfs: factor the ag length extension code into libxfs 2018-05-15 18:12:51 -07:00
xfs_alloc_btree.c xfs: convert to SPDX license tags 2018-06-06 14:17:53 -07:00
xfs_alloc_btree.h xfs: convert to SPDX license tags 2018-06-06 14:17:53 -07:00
xfs_alloc.c xfs: always defer agfl block frees 2018-08-02 23:05:14 -07:00
xfs_alloc.h xfs: remove xfs_alloc_arg firstblock field 2018-07-11 22:26:30 -07:00
xfs_attr_leaf.c xfs: fix overflow in xfs_attr3_leaf_verify 2018-11-06 07:50:50 -08:00
xfs_attr_leaf.h xfs: convert to SPDX license tags 2018-06-06 14:17:53 -07:00
xfs_attr_remote.c xfs: remove last of unnecessary xfs_defer_cancel() callers 2018-09-29 13:41:58 +10:00
xfs_attr_remote.h xfs: convert to SPDX license tags 2018-06-06 14:17:53 -07:00
xfs_attr_sf.h xfs: convert to SPDX license tags 2018-06-06 14:17:53 -07:00
xfs_attr.c xfs: Add attibute remove and helper functions 2018-10-18 17:21:23 +11:00
xfs_attr.h xfs: Add attibute remove and helper functions 2018-10-18 17:21:23 +11:00
xfs_bit.c xfs: convert to SPDX license tags 2018-06-06 14:17:53 -07:00
xfs_bit.h xfs: convert to SPDX license tags 2018-06-06 14:17:53 -07:00
xfs_bmap_btree.c xfs: pass transaction to xfs_defer_add() 2018-08-02 23:05:14 -07:00
xfs_bmap_btree.h xfs: convert to SPDX license tags 2018-06-06 14:17:53 -07:00
xfs_bmap.c xfs: Add attibute set and helper functions 2018-10-18 17:21:16 +11:00
xfs_bmap.h xfs: Add attibute set and helper functions 2018-10-18 17:21:16 +11:00
xfs_btree.c xfs: convert to SPDX license tags 2018-06-06 14:17:53 -07:00
xfs_btree.h xfs: fold dfops into the transaction 2018-08-02 23:05:14 -07:00
xfs_cksum.h License cleanup: add SPDX GPL-2.0 license identifier to files with no license 2017-11-02 11:10:55 +01:00
xfs_da_btree.c xfs: check da node magic in _node_lookup_int 2018-08-01 07:42:43 -07:00
xfs_da_btree.h xfs: fold dfops into the transaction 2018-08-02 23:05:14 -07:00
xfs_da_format.c xfs: convert to SPDX license tags 2018-06-06 14:17:53 -07:00
xfs_da_format.h xfs: convert to SPDX license tags 2018-06-06 14:17:53 -07:00
xfs_defer.c xfs: fold dfops into the transaction 2018-08-02 23:05:14 -07:00
xfs_defer.h xfs: fold dfops into the transaction 2018-08-02 23:05:14 -07:00
xfs_dir2_block.c xfs: clean up MIN/MAX 2018-06-08 10:07:52 -07:00
xfs_dir2_data.c xfs: convert to SPDX license tags 2018-06-06 14:17:53 -07:00
xfs_dir2_leaf.c xfs: clean up MIN/MAX 2018-06-08 10:07:52 -07:00
xfs_dir2_node.c xfs: use swap macro in xfs_dir2_leafn_rebalance 2018-07-17 14:25:57 -07:00
xfs_dir2_priv.h xfs: convert to SPDX license tags 2018-06-06 14:17:53 -07:00
xfs_dir2_sf.c xfs: convert to SPDX license tags 2018-06-06 14:17:53 -07:00
xfs_dir2.c xfs: fold dfops into the transaction 2018-08-02 23:05:14 -07:00
xfs_dir2.h xfs: fold dfops into the transaction 2018-08-02 23:05:14 -07:00
xfs_dquot_buf.c xfs: convert to SPDX license tags 2018-06-06 14:17:53 -07:00
xfs_errortag.h xfs: force summary counter recalc at next mount 2018-07-23 09:08:01 -07:00
xfs_format.h xfs: remove suport for filesystems without unwritten extent flag 2018-10-18 17:18:58 +11:00
xfs_fs.h xfs: convert to SPDX license tags 2018-06-06 14:17:53 -07:00
xfs_ialloc_btree.c xfs: pass transaction lock while setting up agresv on cyclic metadata 2018-07-29 22:37:08 -07:00
xfs_ialloc_btree.h xfs: pass transaction lock while setting up agresv on cyclic metadata 2018-07-29 22:37:08 -07:00
xfs_ialloc.c xfs: pass transaction to xfs_defer_add() 2018-08-02 23:05:14 -07:00
xfs_ialloc.h xfs: remove dfops parameter from ifree call stack 2018-07-11 22:26:07 -07:00
xfs_iext_tree.c xfs: use WRITE_ONCE to update if_seq 2018-08-07 10:57:12 -07:00
xfs_inode_buf.c xfs: validate inode di_forkoff 2018-09-29 13:50:13 +10:00
xfs_inode_buf.h xfs: convert to SPDX license tags 2018-06-06 14:17:53 -07:00
xfs_inode_fork.c xfs: remove the xfs_ifork_t typedef 2018-07-30 07:57:48 -07:00
xfs_inode_fork.h xfs: maintain a sequence count for inode fork manipulations 2018-07-31 13:18:09 -07:00
xfs_log_format.h xfs: refactor unmount record write 2018-07-23 09:08:01 -07:00
xfs_log_recover.h xfs: convert to SPDX license tags 2018-06-06 14:17:53 -07:00
xfs_log_rlimit.c xfs: convert to SPDX license tags 2018-06-06 14:17:53 -07:00
xfs_quota_defs.h xfs: convert to SPDX license tags 2018-06-06 14:17:53 -07:00
xfs_refcount_btree.c xfs: pass transaction lock while setting up agresv on cyclic metadata 2018-07-29 22:37:08 -07:00
xfs_refcount_btree.h xfs: pass transaction lock while setting up agresv on cyclic metadata 2018-07-29 22:37:08 -07:00
xfs_refcount.c xfs: pass transaction to xfs_defer_add() 2018-08-02 23:05:14 -07:00
xfs_refcount.h xfs: pass transaction to xfs_defer_add() 2018-08-02 23:05:14 -07:00
xfs_rmap_btree.c xfs: pass transaction lock while setting up agresv on cyclic metadata 2018-07-29 22:37:08 -07:00
xfs_rmap_btree.h xfs: pass transaction lock while setting up agresv on cyclic metadata 2018-07-29 22:37:08 -07:00
xfs_rmap.c xfs: pass transaction to xfs_defer_add() 2018-08-02 23:05:14 -07:00
xfs_rmap.h xfs: pass transaction to xfs_defer_add() 2018-08-02 23:05:14 -07:00
xfs_rtbitmap.c xfs: fix off-by-one error in xfs_rtalloc_query_range 2018-06-24 11:56:36 -07:00
xfs_sb.c xfs: remove suport for filesystems without unwritten extent flag 2018-10-18 17:18:58 +11:00
xfs_sb.h xfs: convert to SPDX license tags 2018-06-06 14:17:53 -07:00
xfs_shared.h xfs: replace dop_low with transaction flag 2018-08-02 23:05:13 -07:00
xfs_symlink_remote.c xfs: convert to SPDX license tags 2018-06-06 14:17:53 -07:00
xfs_trans_resv.c xfs: clean up MIN/MAX 2018-06-08 10:07:52 -07:00
xfs_trans_resv.h xfs: convert to SPDX license tags 2018-06-06 14:17:53 -07:00
xfs_trans_space.h xfs: convert to SPDX license tags 2018-06-06 14:17:53 -07:00
xfs_types.c xfs: verify icount in superblock write 2018-07-31 13:18:09 -07:00
xfs_types.h xfs: verify icount in superblock write 2018-07-31 13:18:09 -07:00