• Dan Carpenter's avatar
    accel/qaic: Clean up integer overflow checking in map_user_pages() · 96d3c1ca
    Dan Carpenter authored
    The encode_dma() function has some validation on in_trans->size but it
    would be more clear to move those checks to find_and_map_user_pages().
    
    The encode_dma() had two checks:
    
    	if (in_trans->addr + in_trans->size < in_trans->addr || !in_trans->size)
    		return -EINVAL;
    
    The in_trans->addr variable is the starting address.  The in_trans->size
    variable is the total size of the transfer.  The transfer can occur in
    parts and the resources->xferred_dma_size tracks how many bytes we have
    already transferred.
    
    This patch introduces a new variable "remaining" which represents the
    amount we want to transfer (in_trans->size) minus the amount we have
    already transferred (resources->xferred_dma_size).
    
    I have modified the check for if in_trans->size is zero to instead check
    if in_trans->size is less than resources->xferred_dma_size.  If we have
    already transferred more bytes than in_trans->size then there are negative
    bytes remaining which doesn't make sense.  If there are zero bytes
    remaining to be copied, just return success.
    
    The check in encode_dma() checked that "addr + size" could not overflow
    and barring a driver bug that should work, but it's easier to check if
    we do this in parts.  First check that "in_trans->addr +
    resources->xferred_dma_size" is safe.  Then check that "xfer_start_addr +
    remaining" is safe.
    
    My final concern was that we are dealing with u64 values but on 32bit
    systems the kmalloc() function will truncate the sizes to 32 bits.  So
    I calculated "total = in_trans->size + offset_in_page(xfer_start_addr);"
    and returned -EINVAL if it were >= SIZE_MAX.  This will not affect 64bit
    systems.
    
    Fixes: 129776ac ("accel/qaic: Add control path")
    Signed-off-by: default avatarDan Carpenter <dan.carpenter@linaro.org>
    Reviewed-by: default avatarJeffrey Hugo <quic_jhugo@quicinc.com>
    Reviewed-by: default avatarCarl Vanderlip <quic_carlv@quicinc.com>
    Signed-off-by: default avatarJeffrey Hugo <quic_jhugo@quicinc.com>
    Link: https://patchwork.freedesktop.org/patch/msgid/24d3348b-25ac-4c1b-b171-9dae7c43e4e0@moroto.mountain
    96d3c1ca
qaic_control.c 40.7 KB