• Arvid Brodin's avatar
    usb/isp1760: Fix race condition memory leak · c64391f2
    Arvid Brodin authored
    This fixes a memory leak reported by Catalin Marinas:
    
    schedule_ptds() is called from isp1760_irq() and removes the qh from the
    controlqhs queue but ep->hcpriv still points to the qh and therefore it is not
    freed.
    
    Shortly after this, the isp1760_endpoint_disable() function sets ep->hcpriv to
    NULL and calls schedule_ptds() but since the corresponding qh is no longer in
    the queue, it is simply forgotten and reported by kmemleak.
    
    With this patch, the qh is always freed at endpoint_disable, instead, and the
    corresponding entry removed from the queue head list.
    
    While I was at it, I also replaced the lines in isp1760_endpoint_disable()
    that removed remaining qtds from the qh with a WARN_ON check for non-empty qh,
    in line with earlier comments from Alan Stern (linux-usb list, 2011-07-20).
    Signed-off-by: default avatarArvid Brodin <arvid.brodin@enea.com>
    Tested-by: default avatarCatalin Marinas <catalin.marinas@arm.com>
    Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@suse.de>
    c64391f2
isp1760-hcd.c 57.1 KB