• Lars-Peter Clausen's avatar
    usb: gadget: f_fs: Fix EFAULT generation for async read operations · 447d63a1
    Lars-Peter Clausen authored
    commit 332a5b44 upstream.
    
    In the current implementation functionfs generates a EFAULT for async read
    operations if the read buffer size is larger than the URB data size. Since
    a application does not necessarily know how much data the host side is
    going to send it typically supplies a buffer larger than the actual data,
    which will then result in a EFAULT error.
    
    This behaviour was introduced while refactoring the code to use iov_iter
    interface in commit c993c39b ("gadget/function/f_fs.c: use put iov_iter
    into io_data"). The original code took the minimum over the URB size and
    the user buffer size and then attempted to copy that many bytes using
    copy_to_user(). If copy_to_user() could not copy all data a EFAULT error
    was generated. Restore the original behaviour by only generating a EFAULT
    error when the number of bytes copied is not the size of the URB and the
    target buffer has not been fully filled.
    
    Commit 342f39a6 ("usb: gadget: f_fs: fix check in read operation")
    already fixed the same problem for the synchronous read path.
    
    Fixes: c993c39b ("gadget/function/f_fs.c: use put iov_iter into io_data")
    Acked-by: default avatarMichal Nazarewicz <mina86@mina86.com>
    Signed-off-by: default avatarLars-Peter Clausen <lars@metafoo.de>
    Signed-off-by: default avatarFelipe Balbi <felipe.balbi@linux.intel.com>
    Signed-off-by: default avatarKamal Mostafa <kamal@canonical.com>
    447d63a1
f_fs.c 79.2 KB