lkml.org 
[lkml]   [2022]   [Jun]   [13]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH AUTOSEL 5.10 23/29] nfc: nfcmrvl: Fix memory leak in nfcmrvl_play_deferred
    Date
    From: Xiaohui Zhang <xiaohuizhang@ruc.edu.cn>

    [ Upstream commit 8a4d480702b71184fabcf379b80bf7539716752e ]

    Similar to the handling of play_deferred in commit 19cfe912c37b
    ("Bluetooth: btusb: Fix memory leak in play_deferred"), we thought
    a patch might be needed here as well.

    Currently usb_submit_urb is called directly to submit deferred tx
    urbs after unanchor them.

    So the usb_giveback_urb_bh would failed to unref it in usb_unanchor_urb
    and cause memory leak.

    Put those urbs in tx_anchor to avoid the leak, and also fix the error
    handling.

    Signed-off-by: Xiaohui Zhang <xiaohuizhang@ruc.edu.cn>
    Acked-by: Krzysztof Kozlowski <krzysztof.kozlowski@linaro.org>
    Link: https://lore.kernel.org/r/20220607083230.6182-1-xiaohuizhang@ruc.edu.cn
    Signed-off-by: Jakub Kicinski <kuba@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    drivers/nfc/nfcmrvl/usb.c | 16 ++++++++++++++--
    1 file changed, 14 insertions(+), 2 deletions(-)

    diff --git a/drivers/nfc/nfcmrvl/usb.c b/drivers/nfc/nfcmrvl/usb.c
    index 888e298f610b..f26986eb53f1 100644
    --- a/drivers/nfc/nfcmrvl/usb.c
    +++ b/drivers/nfc/nfcmrvl/usb.c
    @@ -401,13 +401,25 @@ static void nfcmrvl_play_deferred(struct nfcmrvl_usb_drv_data *drv_data)
    int err;

    while ((urb = usb_get_from_anchor(&drv_data->deferred))) {
    + usb_anchor_urb(urb, &drv_data->tx_anchor);
    +
    err = usb_submit_urb(urb, GFP_ATOMIC);
    - if (err)
    + if (err) {
    + kfree(urb->setup_packet);
    + usb_unanchor_urb(urb);
    + usb_free_urb(urb);
    break;
    + }

    drv_data->tx_in_flight++;
    + usb_free_urb(urb);
    + }
    +
    + /* Cleanup the rest deferred urbs. */
    + while ((urb = usb_get_from_anchor(&drv_data->deferred))) {
    + kfree(urb->setup_packet);
    + usb_free_urb(urb);
    }
    - usb_scuttle_anchored_urbs(&drv_data->deferred);
    }

    static int nfcmrvl_resume(struct usb_interface *intf)
    --
    2.35.1
    \
     
     \ /
      Last update: 2022-06-14 04:21    [W:5.110 / U:0.088 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site