summaryrefslogtreecommitdiff
path: root/sound/usb/endpoint.c
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2026-09-17 09:57:09 -0700
committerLinus Torvalds <torvalds@linux-foundation.org>2026-09-17 09:57:09 -0700
commit4982d3552a3bf94de503acf93433277d08421de6 (patch)
tree94956c7fb806cee3dd376119b19f0df2fa5be69f /sound/usb/endpoint.c
parentf143ea21cf834b4d57d70b47b99e582461f2dfaf (diff)
parent546b928da0427b0d6c663cbb992bd7bfa9ac7971 (diff)
Merge tag 'sound-7.3-rc4' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound
Pull sound fixes from Takashi Iwai: "A collection of small fixes. Most of them are device-specific fixes while there are a few core fixes. The continued flux, but not too scaring yet. Some highlights below. ALSA Core: - Fix potential UAF after asynchronous card release - Fix a race condition in PCM timer initialization order USB-Audio: - Hardening fixes for issues reported by fuzzer for 6fire, bcd2000, and implicit FB packets - Fix double list addition in implicit FB handling - Quirks for AVerMedia GC553Pro and Behringer FCA1616 HD-Audio: - Quirks / fixes for HP OmniBook 7, OMEN 15, and Victus 15 laptops ASoC: - Support for DAI link codec channel mask to avoid mismatches - Fix HDMI-codec channel status change report - Fixes for various codecs and platforms: Realtek rt712/rt721 (calibration, reset fixes), Cirrus Logic (empty EFI variable validation, capture channel fixup), AMD ACP SoundWire (bounds checks, refactorings), ADAU1977 (OF match table support, SPI cleanups), ES8336 (Huawei Matebook B3-420 quirk), UX500 (macro fix)" * tag 'sound-7.3-rc4' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound: (33 commits) ASoC: adau1977-i2c: add OF match table for I2C ASoC: adau1977-spi: drop __maybe_unused and of_match_ptr() ASoC: adau1977: make the Kconfig symbols user selectable ASoC: amd: acp: fix card name length warning in SOF SoundWire machine driver ASoC: amd: acp: fix ffs() operator precedence for SoundWire link ID ASoC: amd: acp: refactor codec config count in SOF SoundWire machine driver ASoC: amd: acp: bounds-check SoundWire link ID in machine drivers ASoC: cs-amp-lib: Prevent NULL pointer if efi variable is zero length ASoC: codecs: rt712-sdca-dmic: fix uninitialized stream_config->type ASoC: hdmi-codec: Report a change when the channel status moves ASoC: ux500: Parenthesize MSP_{RX,TX}_CLKPOL_BIT() arguments ASoC: rt721: Reset codec to fix abnormal sound ALSA: usb-audio: fix list_add double-add in push_back_to_ready_list ALSA: hda: trace PCM open only after assigning a stream ALSA: usb-audio: skip the broken mute control on AVerMedia GC553Pro ALSA: hda/realtek: Enable mute LEDs on HP OmniBook 7 17-dc0xxx ALSA: 6fire: fix OOB write from device-reported iso length ALSA: usb-audio: Add capture quirk for Behringer FCA1616 ALSA: hda/realtek: Add mute LED quirk for HP OMEN 15-ax ASoC: Intel: sof_es8336: Add a quirk for Huawei Matebook B3-420 ...
Diffstat (limited to 'sound/usb/endpoint.c')
-rw-r--r--sound/usb/endpoint.c21
1 files changed, 14 insertions, 7 deletions
diff --git a/sound/usb/endpoint.c b/sound/usb/endpoint.c
index 0835943d7b0e..879d0451536e 100644
--- a/sound/usb/endpoint.c
+++ b/sound/usb/endpoint.c
@@ -449,7 +449,9 @@ static void push_back_to_ready_list(struct snd_usb_endpoint *ep,
struct snd_urb_ctx *ctx)
{
guard(spinlock_irqsave)(&ep->lock);
- list_add_tail(&ctx->ready_list, &ep->ready_playback_urbs);
+ /* ctx may still be linked: a stale completion racing a stop/restart. */
+ if (list_empty(&ctx->ready_list))
+ list_add_tail(&ctx->ready_list, &ep->ready_playback_urbs);
}
/*
@@ -492,9 +494,10 @@ int snd_usb_queue_pending_output_urbs(struct snd_usb_endpoint *ep,
/* copy over the length information */
if (implicit_fb) {
- ctx->packets = packet->packets;
+ ctx->packets = min_t(int, packet->packets,
+ ep->max_urb_packs);
memcpy(ctx->packet_size, packet->packet_size,
- packet->packets * sizeof(packet->packet_size[0]));
+ ctx->packets * sizeof(packet->packet_size[0]));
}
/* call the data handler to fill in playback data */
@@ -1036,6 +1039,7 @@ void snd_usb_endpoint_sync_pending_stop(struct snd_usb_endpoint *ep)
*/
static int stop_urbs(struct snd_usb_endpoint *ep, bool force, bool keep_pending)
{
+ struct snd_urb_ctx *ctx, *n;
unsigned int i;
if (!force && atomic_read(&ep->running))
@@ -1045,7 +1049,9 @@ static int stop_urbs(struct snd_usb_endpoint *ep, bool force, bool keep_pending)
return 0;
scoped_guard(spinlock_irqsave, &ep->lock) {
- INIT_LIST_HEAD(&ep->ready_playback_urbs);
+ /* Unlink each ctx; INIT_LIST_HEAD() alone would leave them looking linked. */
+ list_for_each_entry_safe(ctx, n, &ep->ready_playback_urbs, ready_list)
+ list_del_init(&ctx->ready_list);
ep->next_packet_head = 0;
ep->next_packet_queued = 0;
}
@@ -1242,15 +1248,16 @@ static int data_ep_set_params(struct snd_usb_endpoint *ep)
ep->nurbs = min(max_urbs, urbs_per_period * ep->cur_buffer_periods);
}
+ if (fmt->fmt_type == UAC_FORMAT_TYPE_II)
+ urb_packs++; /* for transfer delimiter */
+ ep->max_urb_packs = urb_packs;
+
/* allocate and initialize data urbs */
for (i = 0; i < ep->nurbs; i++) {
struct snd_urb_ctx *u = &ep->urb[i];
u->index = i;
u->ep = ep;
u->packets = urb_packs;
-
- if (fmt->fmt_type == UAC_FORMAT_TYPE_II)
- u->packets++; /* for transfer delimiter */
u->buffer_size = maxsize * u->packets;
u->urb = usb_alloc_urb(u->packets, GFP_KERNEL);
if (!u->urb)