mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
* [PATCH] ALSA: usx2y: Initialize idle URBs before submitting streams
@ 2026-10-28 10:31 YuanZhe Liu
  2026-10-30 17:36 ` YuanZhe Liu
  2026-10-31 15:42 ` Takashi Iwai
  0 siblings, 2 replies; 3+ messages in thread
From: YuanZhe Liu @ 2026-10-28 10:31 UTC (permalink / raw)
  To: Jaroslav Kysela, Takashi Iwai
  Cc: linux-sound, linux-kernel, stable, Bin Yu, Cheng Wen

usb_stream_start() submits the first two capture and playback URBs and
only afterwards assigns sk->idle_inurb, sk->idle_outurb,
sk->completed_inurb and sk->completed_outurb to the remaining two URBs
of each direction.

A transfer can complete as soon as usb_submit_urb() has been called, so
the completion handler i_capture_start() or i_playback_start() may run
before those pointers are set.  While the stream is still being
synchronized (state below usb_stream_sync1), stream_start() then calls
playback_prep_freqn(sk, sk->idle_outurb) with sk->idle_outurb still
NULL, and the packet descriptors are written through that NULL pointer:

  Oops: general protection fault, probably for non-canonical address
  0xdffffc0000000018: 0000 [#1] SMP KASAN
  KASAN: null-ptr-deref in range [0x00000000000000c0-0x00000000000000c7]
  RIP: 0010:playback_prep_freqn+0x11c/0x4a0 sound/usb/usx2y/usb_stream.c:33
  Call Trace:
   <IRQ>
   stream_start+0x5dc/0x8d0 sound/usb/usx2y/usb_stream.c:596
   i_capture_start+0x3da/0x710 sound/usb/usx2y/usb_stream.c:654
   __usb_hcd_giveback_urb+0x238/0x550 drivers/usb/core/hcd.c:1657
   usb_giveback_urb_bh+0x20b/0x530 drivers/usb/core/hcd.c:1691
   tasklet_hi_action+0xa/0x20 kernel/softirq.c:994
   handle_softirqs+0x16f/0x440 kernel/softirq.c:645
   </IRQ>

The four URBs referenced by these pointers are allocated long before and
do not depend on any transfer state, so assign them before the submit
loop.  Keeping the assignment inside the retry path also restores a
well-defined URB rotation when the start frame mismatch handling kills
and resubmits the streams.

Fixes: 030a07e441296c372f946cd4065b5d831d8dc40c ("ALSA: Add USB US122L driver")
Cc: stable@vger.kernel.org
Co-developed-by: Bin Yu <byu@xidian.edu.cn>
Signed-off-by: Bin Yu <byu@xidian.edu.cn>
Co-developed-by: Cheng Wen <wencheng@xidian.edu.cn>
Signed-off-by: Cheng Wen <wencheng@xidian.edu.cn>
Signed-off-by: YuanZhe Liu <25031212351@stu.xidian.edu.cn>
---
 sound/usb/usx2y/usb_stream.c | 9 ++++-----
 1 file changed, 4 insertions(+), 5 deletions(-)

diff --git a/sound/usb/usx2y/usb_stream.c b/sound/usb/usx2y/usb_stream.c
index 3122cf653273..7d621280fba3 100644
--- a/sound/usb/usx2y/usb_stream.c
+++ b/sound/usb/usx2y/usb_stream.c
@@ -682,6 +682,10 @@ int usb_stream_start(struct usb_stream_kernel *sk)
 	s->sync_packet = -1;
 	s->inpacket_head = -1;
 	sk->iso_frame_balance = 0;
+	sk->idle_inurb = sk->inurb[USB_STREAM_NURBS - 2];
+	sk->idle_outurb = sk->outurb[USB_STREAM_NURBS - 2];
+	sk->completed_inurb = sk->inurb[USB_STREAM_NURBS - 1];
+	sk->completed_outurb = sk->outurb[USB_STREAM_NURBS - 1];
 	++try;
 	for (u = 0; u < 2; u++) {
 		struct urb *inurb = sk->inurb[u];
@@ -739,11 +743,6 @@ int usb_stream_start(struct usb_stream_kernel *sk)
 		return -EFAULT;
 	}
 
-	sk->idle_inurb = sk->inurb[USB_STREAM_NURBS - 2];
-	sk->idle_outurb = sk->outurb[USB_STREAM_NURBS - 2];
-	sk->completed_inurb = sk->inurb[USB_STREAM_NURBS - 1];
-	sk->completed_outurb = sk->outurb[USB_STREAM_NURBS - 1];
-
 /* wait, check */
 	{
 		int wait_ms = 3000;
-- 
2.34.1


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

* Re: [PATCH] ALSA: usx2y: Initialize idle URBs before submitting streams
  2026-10-28 10:31 [PATCH] ALSA: usx2y: Initialize idle URBs before submitting streams YuanZhe Liu
@ 2026-10-30 17:36 ` YuanZhe Liu
  2026-10-31 15:42 ` Takashi Iwai
  1 sibling, 0 replies; 3+ messages in thread
From: YuanZhe Liu @ 2026-10-30 17:36 UTC (permalink / raw)
  To: Jaroslav Kysela, Takashi Iwai, Takashi Iwai
  Cc: linux-sound, linux-kernel, stable, Bin Yu, Cheng Wen

Hi Takashi,

Could you please review this patch?

  [PATCH] ALSA: usx2y: Initialize idle URBs before submitting streams

It initializes the idle URB pointers before submitting USB stream URBs,
preventing a NULL dereference in the completion path.

The patch is unchanged. I am copying this address for visibility.

Original submission:
https://lore.kernel.org/r/20261028103158.22996-1-25031212351@stu.xidian.edu.cn

Thanks,
YuanZhe


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

* Re: [PATCH] ALSA: usx2y: Initialize idle URBs before submitting streams
  2026-10-28 10:31 [PATCH] ALSA: usx2y: Initialize idle URBs before submitting streams YuanZhe Liu
  2026-10-30 17:36 ` YuanZhe Liu
@ 2026-10-31 15:42 ` Takashi Iwai
  1 sibling, 0 replies; 3+ messages in thread
From: Takashi Iwai @ 2026-10-31 15:42 UTC (permalink / raw)
  To: YuanZhe Liu
  Cc: Jaroslav Kysela, Takashi Iwai, linux-sound, linux-kernel, stable,
	Bin Yu, Cheng Wen

On Wed, 28 Oct 2026 11:31:58 +0100,
YuanZhe Liu wrote:
> 
> usb_stream_start() submits the first two capture and playback URBs and
> only afterwards assigns sk->idle_inurb, sk->idle_outurb,
> sk->completed_inurb and sk->completed_outurb to the remaining two URBs
> of each direction.
> 
> A transfer can complete as soon as usb_submit_urb() has been called, so
> the completion handler i_capture_start() or i_playback_start() may run
> before those pointers are set.  While the stream is still being
> synchronized (state below usb_stream_sync1), stream_start() then calls
> playback_prep_freqn(sk, sk->idle_outurb) with sk->idle_outurb still
> NULL, and the packet descriptors are written through that NULL pointer:
> 
>   Oops: general protection fault, probably for non-canonical address
>   0xdffffc0000000018: 0000 [#1] SMP KASAN
>   KASAN: null-ptr-deref in range [0x00000000000000c0-0x00000000000000c7]
>   RIP: 0010:playback_prep_freqn+0x11c/0x4a0 sound/usb/usx2y/usb_stream.c:33
>   Call Trace:
>    <IRQ>
>    stream_start+0x5dc/0x8d0 sound/usb/usx2y/usb_stream.c:596
>    i_capture_start+0x3da/0x710 sound/usb/usx2y/usb_stream.c:654
>    __usb_hcd_giveback_urb+0x238/0x550 drivers/usb/core/hcd.c:1657
>    usb_giveback_urb_bh+0x20b/0x530 drivers/usb/core/hcd.c:1691
>    tasklet_hi_action+0xa/0x20 kernel/softirq.c:994
>    handle_softirqs+0x16f/0x440 kernel/softirq.c:645
>    </IRQ>
> 
> The four URBs referenced by these pointers are allocated long before and
> do not depend on any transfer state, so assign them before the submit
> loop.  Keeping the assignment inside the retry path also restores a
> well-defined URB rotation when the start frame mismatch handling kills
> and resubmits the streams.
> 
> Fixes: 030a07e441296c372f946cd4065b5d831d8dc40c ("ALSA: Add USB US122L driver")
> Cc: stable@vger.kernel.org
> Co-developed-by: Bin Yu <byu@xidian.edu.cn>
> Signed-off-by: Bin Yu <byu@xidian.edu.cn>
> Co-developed-by: Cheng Wen <wencheng@xidian.edu.cn>
> Signed-off-by: Cheng Wen <wencheng@xidian.edu.cn>
> Signed-off-by: YuanZhe Liu <25031212351@stu.xidian.edu.cn>

Applied now.  Thanks.


Takashi

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

end of thread, other threads:[~2026-10-31 15:42 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2026-10-28 10:31 [PATCH] ALSA: usx2y: Initialize idle URBs before submitting streams YuanZhe Liu
2026-10-30 17:36 ` YuanZhe Liu
2026-10-31 15:42 ` Takashi Iwai

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®