diff options
| author | Darrick J. Wong <darrick.wong@oracle.com> | 2018-01-16 18:54:12 -0800 | 
|---|---|---|
| committer | Darrick J. Wong <darrick.wong@oracle.com> | 2018-01-17 21:00:46 -0800 | 
| commit | ce92d29ddf9908d397895c46b7c78e9db8df414d (patch) | |
| tree | e05535b52a47a975f80995bca5e1260fd3248fa7 /fs/xfs/libxfs/xfs_dir2_sf.c | |
| parent | 638a7174894c8f2195430990b614615ef16e3912 (diff) | |
xfs: directory scrubber must walk through data block to offset
In xfs_scrub_dir_rec, we must walk through the directory block entries
to arrive at the offset given by the hash structure.  If we blindly
trust the hash address, we can end up midway into a directory entry and
stray outside the block.  Found by lastbit fuzzing lents[3].address in
xfs/390 with KASAN enabled.
Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
Reviewed-by: Dave Chinner <dchinner@redhat.com>
Diffstat (limited to 'fs/xfs/libxfs/xfs_dir2_sf.c')
| -rw-r--r-- | fs/xfs/libxfs/xfs_dir2_sf.c | 4 | 
1 files changed, 1 insertions, 3 deletions
| diff --git a/fs/xfs/libxfs/xfs_dir2_sf.c b/fs/xfs/libxfs/xfs_dir2_sf.c index 8500fa2a1321..0c75a7f00883 100644 --- a/fs/xfs/libxfs/xfs_dir2_sf.c +++ b/fs/xfs/libxfs/xfs_dir2_sf.c @@ -156,7 +156,6 @@ xfs_dir2_block_to_sf(  	xfs_dir2_sf_hdr_t	*sfhp)		/* shortform directory hdr */  {  	xfs_dir2_data_hdr_t	*hdr;		/* block header */ -	xfs_dir2_block_tail_t	*btp;		/* block tail pointer */  	xfs_dir2_data_entry_t	*dep;		/* data entry pointer */  	xfs_inode_t		*dp;		/* incore directory inode */  	xfs_dir2_data_unused_t	*dup;		/* unused data pointer */ @@ -192,9 +191,8 @@ xfs_dir2_block_to_sf(  	/*  	 * Set up to loop over the block's entries.  	 */ -	btp = xfs_dir2_block_tail_p(args->geo, hdr);  	ptr = (char *)dp->d_ops->data_entry_p(hdr); -	endptr = (char *)xfs_dir2_block_leaf_p(btp); +	endptr = xfs_dir3_data_endp(args->geo, hdr);  	sfep = xfs_dir2_sf_firstentry(sfp);  	/*  	 * Loop over the active and unused entries. | 
