• Fedor Pchelkin's avatar
    wifi: ath9k: hif_usb: fix memory leak of remain_skbs · 7654cc03
    Fedor Pchelkin authored
    hif_dev->remain_skb is allocated and used exclusively in
    ath9k_hif_usb_rx_stream(). It is implied that an allocated remain_skb is
    processed and subsequently freed (in error paths) only during the next
    call of ath9k_hif_usb_rx_stream().
    
    So, if the urbs are deallocated between those two calls due to the device
    deinitialization or suspend, it is possible that ath9k_hif_usb_rx_stream()
    is not called next time and the allocated remain_skb is leaked. Our local
    Syzkaller instance was able to trigger that.
    
    remain_skb makes sense when receiving two consecutive urbs which are
    logically linked together, i.e. a specific data field from the first skb
    indicates a cached skb to be allocated, memcpy'd with some data and
    subsequently processed in the next call to ath9k_hif_usb_rx_stream(). Urbs
    deallocation supposedly makes that link irrelevant so we need to free the
    cached skb in those cases.
    
    Fix the leak by introducing a function to explicitly free remain_skb (if
    it is not NULL) when the rx urbs have been deallocated. remain_skb is NULL
    when it has not been allocated at all (hif_dev struct is kzalloced) or
    when it has been processed in next call to ath9k_hif_usb_rx_stream().
    
    Found by Linux Verification Center (linuxtesting.org) with Syzkaller.
    
    Fixes: fb9987d0 ("ath9k_htc: Support for AR9271 chipset.")
    Signed-off-by: default avatarFedor Pchelkin <pchelkin@ispras.ru>
    Signed-off-by: default avatarAlexey Khoroshilov <khoroshilov@ispras.ru>
    Acked-by: default avatarToke Høiland-Jørgensen <toke@toke.dk>
    Signed-off-by: default avatarKalle Valo <quic_kvalo@quicinc.com>
    Link: https://lore.kernel.org/r/20230216192301.171225-1-pchelkin@ispras.ru
    7654cc03
hif_usb.c 35.6 KB