• Jia-Ju Bai's avatar
    usb: r8a66597: Fix a possible concurrency use-after-free bug in r8a66597_endpoint_disable() · c85400f8
    Jia-Ju Bai authored
    The function r8a66597_endpoint_disable() and r8a66597_urb_enqueue() may
    be concurrently executed.
    The two functions both access a possible shared variable "hep->hcpriv".
    
    This shared variable is freed by r8a66597_endpoint_disable() via the
    call path:
    r8a66597_endpoint_disable
      kfree(hep->hcpriv) (line 1995 in Linux-4.19)
    
    This variable is read by r8a66597_urb_enqueue() via the call path:
    r8a66597_urb_enqueue
      spin_lock_irqsave(&r8a66597->lock)
      init_pipe_info
        enable_r8a66597_pipe
          pipe = hep->hcpriv (line 802 in Linux-4.19)
    
    The read operation is protected by a spinlock, but the free operation
    is not protected by this spinlock, thus a concurrency use-after-free bug
    may occur.
    
    To fix this bug, the spin-lock and spin-unlock function calls in
    r8a66597_endpoint_disable() are moved to protect the free operation.
    Signed-off-by: default avatarJia-Ju Bai <baijiaju1990@gmail.com>
    Cc: stable <stable@vger.kernel.org>
    Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
    c85400f8
r8a66597-hcd.c 62.6 KB