Re: [PATCH] memstick: core: wait for request completion before freeing card
From: Ulf Hansson
Date: Tue Sep 29 2026 - 09:41:06 EST
On Thu, Sep 24, 2026 at 9:29 PM Raj Ojha <rajojha047@xxxxxxxxx> wrote:
>
> In memstick_alloc_card() and memstick_set_rw_addr(),
> wait_for_completion_timeout() is used to wait for device identification
> and address configuration requests to complete.
>
> The memstick subsystem does not provide an abort or cancellation
> callback in struct memstick_host for in-flight requests. If
> wait_for_completion_timeout() expires (for instance, when a USB transfer
> or command retry is delayed), memstick_alloc_card() returns an error and
> frees the memstick_dev structure via kfree(card).
>
> However, the host controller driver (such as rtsx_usb_ms) is still
> running the request asynchronously in worker context. When the transfer
> eventually finishes, the driver writes into host->req->data, which
> points to memory inside the already freed card structure. This leads to
> a KASAN slab-use-after-free write:
>
> BUG: KASAN: slab-use-after-free in ms_read_bytes+0x8fe/0x990
> Write of size 1 at addr ffff88813c188079 by task kworker/1:5/5239
> Workqueue: events rtsx_usb_ms_handle_req
> Call Trace:
> ms_read_bytes+0x8fe/0x990 drivers/memstick/host/rtsx_usb_ms.c:450
> rtsx_usb_ms_issue_cmd drivers/memstick/host/rtsx_usb_ms.c:477 [inline]
> rtsx_usb_ms_handle_req+0x557/0x1a00 drivers/memstick/host/rtsx_usb_ms.c:531
> process_one_work+0xac7/0x1b10 kernel/workqueue.c:3396
> worker_thread+0x5ef/0xe50 kernel/workqueue.c:3560
> kthread+0x373/0x450 kernel/kthread.c:436
>
> Allocated by task 1662:
> memstick_alloc_card drivers/memstick/core/memstick.c:383 [inline]
> memstick_check+0x2c1/0x10d0 drivers/memstick/core/memstick.c:452
> process_one_work+0xac7/0x1b10 kernel/workqueue.c:3396
>
> Freed by task 1662:
> kfree+0x20c/0x650 mm/slub.c:6792
> memstick_alloc_card drivers/memstick/core/memstick.c:420 [inline]
> memstick_check+0x72b/0x10d0 drivers/memstick/core/memstick.c:452
> process_one_work+0xac7/0x1b10 kernel/workqueue.c:3396
>
> Host controller drivers (rtsx_usb_ms, jmb38x_ms, tifm_ms, r592) already
> implement their own hardware and bus timeouts, and callers in
> mspro_block and ms_block already rely on wait_for_completion()
> unconditionally.
>
> Replace wait_for_completion_timeout() with wait_for_completion() in
> memstick_set_rw_addr() and memstick_alloc_card() so that the card
> structure is never freed while an asynchronous request is in flight.
>
> Fixes: baf8532a147d ("memstick: initial commit for Sony MemoryStick support")
> Reported-by: syzbot+ccffdf05833ebdaeae70@xxxxxxxxxxxxxxxxxxxxxxxxx
> Closes: https://syzkaller.appspot.com/bug?extid=ccffdf05833ebdaeae70
> Cc: stable@xxxxxxxxxxxxxxx
> Signed-off-by: Raj Ojha <rajojha047@xxxxxxxxx>
Applied for fixes, thanks!
Kind regards
Uffe
> ---
> drivers/memstick/core/memstick.c | 6 ++----
> 1 file changed, 2 insertions(+), 4 deletions(-)
>
> diff --git a/drivers/memstick/core/memstick.c b/drivers/memstick/core/memstick.c
> index 7f3f47db4c98..1a2b3c4d5e6f 100644
> --- a/drivers/memstick/core/memstick.c
> +++ b/drivers/memstick/core/memstick.c
> @@ -378,9 +378,7 @@ int memstick_set_rw_addr(struct memstick_dev *card)
> {
> card->next_request = h_memstick_set_rw_addr;
> memstick_new_req(card->host);
> - if (!wait_for_completion_timeout(&card->mrq_complete,
> - msecs_to_jiffies(500)))
> - card->current_mrq.error = -ETIMEDOUT;
> + wait_for_completion(&card->mrq_complete);
>
> return card->current_mrq.error;
> }
> @@ -413,9 +411,7 @@ static struct memstick_dev *memstick_alloc_card(struct memstick_host *host)
> goto err_out;
>
> card->next_request = h_memstick_read_dev_id;
> memstick_new_req(host);
> - if (!wait_for_completion_timeout(&card->mrq_complete,
> - msecs_to_jiffies(500)))
> - card->current_mrq.error = -ETIMEDOUT;
> + wait_for_completion(&card->mrq_complete);
>
> if (card->current_mrq.error)
> goto err_out;
> --
> 2.47.0.windows.1