mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
* [PATCH] memstick: core: wait for request completion before freeing card
@ 2026-09-24 20:41 Raj Ojha
  0 siblings, 0 replies; 3+ messages in thread
From: Raj Ojha @ 2026-09-24 20:41 UTC (permalink / raw)
  To: Ulf Hansson
  Cc: Maxim Levitsky, linux-mmc, linux-kernel, syzkaller-bugs,
	Raj Ojha, syzbot+ccffdf05833ebdaeae70, stable

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@syzkaller.appspotmail.com
Closes: https://syzkaller.appspot.com/bug?extid=ccffdf05833ebdaeae70
Cc: stable@vger.kernel.org
Signed-off-by: Raj Ojha <rajojha047@gmail.com>
---
 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

^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: [PATCH] memstick: core: wait for request completion before freeing card
  2026-09-24 19:29 Raj Ojha
@ 2026-09-29 13:34 ` Ulf Hansson
  0 siblings, 0 replies; 3+ messages in thread
From: Ulf Hansson @ 2026-09-29 13:34 UTC (permalink / raw)
  To: Raj Ojha
  Cc: Ulf Hansson, Maxim Levitsky, Alex Dubov, linux-mmc, linux-kernel,
	syzkaller-bugs, syzbot+ccffdf05833ebdaeae70, stable

On Thu, Sep 24, 2026 at 9:29 PM Raj Ojha <rajojha047@gmail.com> 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@syzkaller.appspotmail.com
> Closes: https://syzkaller.appspot.com/bug?extid=ccffdf05833ebdaeae70
> Cc: stable@vger.kernel.org
> Signed-off-by: Raj Ojha <rajojha047@gmail.com>

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

^ permalink raw reply	[flat|nested] 3+ messages in thread

* [PATCH] memstick: core: wait for request completion before freeing card
@ 2026-09-24 19:29 Raj Ojha
  2026-09-29 13:34 ` Ulf Hansson
  0 siblings, 1 reply; 3+ messages in thread
From: Raj Ojha @ 2026-09-24 19:29 UTC (permalink / raw)
  To: Ulf Hansson
  Cc: Maxim Levitsky, Alex Dubov, linux-mmc, linux-kernel,
	syzkaller-bugs, Raj Ojha, syzbot+ccffdf05833ebdaeae70, stable

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@syzkaller.appspotmail.com
Closes: https://syzkaller.appspot.com/bug?extid=ccffdf05833ebdaeae70
Cc: stable@vger.kernel.org
Signed-off-by: Raj Ojha <rajojha047@gmail.com>
---
 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

^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2026-09-29 13:34 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2026-09-24 20:41 [PATCH] memstick: core: wait for request completion before freeing card Raj Ojha
  -- strict thread matches above, loose matches on Subject: below --
2026-09-24 19:29 Raj Ojha
2026-09-29 13:34 ` Ulf Hansson

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox

all inboxes | Powered by JetHome®