• Darrick J. Wong's avatar
    xfs: fix bmv_count confusion w/ shared extents · c364b6d0
    Darrick J. Wong authored
    In a bmapx call, bmv_count is the total size of the array, including the
    zeroth element that userspace uses to supply the search key.  The output
    array starts at offset 1 so that we can set up the user for the next
    invocation.  Since we now can split an extent into multiple bmap records
    due to shared/unshared status, we have to be careful that we don't
    overflow the output array.
    
    In the original patch f86f4037 ("xfs: teach get_bmapx about shared
    extents and the CoW fork") I used cur_ext (the output index) to check
    for overflows, albeit with an off-by-one error.  Since nexleft no longer
    describes the number of unfilled slots in the output, we can rip all
    that out and use cur_ext for the overflow check directly.
    
    Failure to do this causes heap corruption in bmapx callers such as
    xfs_io and xfs_scrub.  xfs/328 can reproduce this problem.
    Reviewed-by: default avatarEric Sandeen <sandeen@redhat.com>
    Signed-off-by: default avatarDarrick J. Wong <darrick.wong@oracle.com>
    c364b6d0
xfs_bmap_util.c 56 KB