Commit 11ac7cc8 authored by Linus Torvalds's avatar Linus Torvalds

Merge tag 'sound-5.4-rc8' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound

Pull sound fixes from Takashi Iwai:
 "A few small last-minute fixes for USB-audio and HD-audio as well as
  for PCM core:

   - A race fix for PCM core between stopping and closing a stream

   - USB-audio regressions in the recent descriptor validation code and
     relevant changes

   - A read of uninitialized value in USB-audio spotted by fuzzer

   - A fix for USB-audio race at stopping a stream

   - Intel HD-audio platform fixes"

* tag 'sound-5.4-rc8' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound:
  ALSA: usb-audio: Fix incorrect size check for processing/extension units
  ALSA: usb-audio: Fix incorrect NULL check in create_yamaha_midi_quirk()
  ALSA: pcm: Fix stream lock usage in snd_pcm_period_elapsed()
  ALSA: usb-audio: not submit urb for stopped endpoint
  ALSA: hda: hdmi - fix pin setup on Tigerlake
  ALSA: hda: Add Cometlake-S PCI ID
  ALSA: usb-audio: Fix missing error check at mixer resolution test
parents 37b49f31 976a68f0
...@@ -1782,11 +1782,14 @@ void snd_pcm_period_elapsed(struct snd_pcm_substream *substream) ...@@ -1782,11 +1782,14 @@ void snd_pcm_period_elapsed(struct snd_pcm_substream *substream)
struct snd_pcm_runtime *runtime; struct snd_pcm_runtime *runtime;
unsigned long flags; unsigned long flags;
if (PCM_RUNTIME_CHECK(substream)) if (snd_BUG_ON(!substream))
return; return;
runtime = substream->runtime;
snd_pcm_stream_lock_irqsave(substream, flags); snd_pcm_stream_lock_irqsave(substream, flags);
if (PCM_RUNTIME_CHECK(substream))
goto _unlock;
runtime = substream->runtime;
if (!snd_pcm_running(substream) || if (!snd_pcm_running(substream) ||
snd_pcm_update_hw_ptr0(substream, 1) < 0) snd_pcm_update_hw_ptr0(substream, 1) < 0)
goto _end; goto _end;
...@@ -1797,6 +1800,7 @@ void snd_pcm_period_elapsed(struct snd_pcm_substream *substream) ...@@ -1797,6 +1800,7 @@ void snd_pcm_period_elapsed(struct snd_pcm_substream *substream)
#endif #endif
_end: _end:
kill_fasync(&runtime->fasync, SIGIO, POLL_IN); kill_fasync(&runtime->fasync, SIGIO, POLL_IN);
_unlock:
snd_pcm_stream_unlock_irqrestore(substream, flags); snd_pcm_stream_unlock_irqrestore(substream, flags);
} }
EXPORT_SYMBOL(snd_pcm_period_elapsed); EXPORT_SYMBOL(snd_pcm_period_elapsed);
......
...@@ -2396,6 +2396,9 @@ static const struct pci_device_id azx_ids[] = { ...@@ -2396,6 +2396,9 @@ static const struct pci_device_id azx_ids[] = {
/* CometLake-H */ /* CometLake-H */
{ PCI_DEVICE(0x8086, 0x06C8), { PCI_DEVICE(0x8086, 0x06C8),
.driver_data = AZX_DRIVER_SKL | AZX_DCAPS_INTEL_SKYLAKE}, .driver_data = AZX_DRIVER_SKL | AZX_DCAPS_INTEL_SKYLAKE},
/* CometLake-S */
{ PCI_DEVICE(0x8086, 0xa3f0),
.driver_data = AZX_DRIVER_SKL | AZX_DCAPS_INTEL_SKYLAKE},
/* Icelake */ /* Icelake */
{ PCI_DEVICE(0x8086, 0x34c8), { PCI_DEVICE(0x8086, 0x34c8),
.driver_data = AZX_DRIVER_SKL | AZX_DCAPS_INTEL_SKYLAKE}, .driver_data = AZX_DRIVER_SKL | AZX_DCAPS_INTEL_SKYLAKE},
......
...@@ -46,10 +46,12 @@ MODULE_PARM_DESC(static_hdmi_pcm, "Don't restrict PCM parameters per ELD info"); ...@@ -46,10 +46,12 @@ MODULE_PARM_DESC(static_hdmi_pcm, "Don't restrict PCM parameters per ELD info");
((codec)->core.vendor_id == 0x80862800)) ((codec)->core.vendor_id == 0x80862800))
#define is_cannonlake(codec) ((codec)->core.vendor_id == 0x8086280c) #define is_cannonlake(codec) ((codec)->core.vendor_id == 0x8086280c)
#define is_icelake(codec) ((codec)->core.vendor_id == 0x8086280f) #define is_icelake(codec) ((codec)->core.vendor_id == 0x8086280f)
#define is_tigerlake(codec) ((codec)->core.vendor_id == 0x80862812)
#define is_haswell_plus(codec) (is_haswell(codec) || is_broadwell(codec) \ #define is_haswell_plus(codec) (is_haswell(codec) || is_broadwell(codec) \
|| is_skylake(codec) || is_broxton(codec) \ || is_skylake(codec) || is_broxton(codec) \
|| is_kabylake(codec) || is_geminilake(codec) \ || is_kabylake(codec) || is_geminilake(codec) \
|| is_cannonlake(codec) || is_icelake(codec)) || is_cannonlake(codec) || is_icelake(codec) \
|| is_tigerlake(codec))
#define is_valleyview(codec) ((codec)->core.vendor_id == 0x80862882) #define is_valleyview(codec) ((codec)->core.vendor_id == 0x80862882)
#define is_cherryview(codec) ((codec)->core.vendor_id == 0x80862883) #define is_cherryview(codec) ((codec)->core.vendor_id == 0x80862883)
#define is_valleyview_plus(codec) (is_valleyview(codec) || is_cherryview(codec)) #define is_valleyview_plus(codec) (is_valleyview(codec) || is_cherryview(codec))
......
...@@ -388,6 +388,9 @@ static void snd_complete_urb(struct urb *urb) ...@@ -388,6 +388,9 @@ static void snd_complete_urb(struct urb *urb)
} }
prepare_outbound_urb(ep, ctx); prepare_outbound_urb(ep, ctx);
/* can be stopped during prepare callback */
if (unlikely(!test_bit(EP_FLAG_RUNNING, &ep->flags)))
goto exit_clear;
} else { } else {
retire_inbound_urb(ep, ctx); retire_inbound_urb(ep, ctx);
/* can be stopped during retire callback */ /* can be stopped during retire callback */
......
...@@ -1229,7 +1229,8 @@ static int get_min_max_with_quirks(struct usb_mixer_elem_info *cval, ...@@ -1229,7 +1229,8 @@ static int get_min_max_with_quirks(struct usb_mixer_elem_info *cval,
if (cval->min + cval->res < cval->max) { if (cval->min + cval->res < cval->max) {
int last_valid_res = cval->res; int last_valid_res = cval->res;
int saved, test, check; int saved, test, check;
get_cur_mix_raw(cval, minchn, &saved); if (get_cur_mix_raw(cval, minchn, &saved) < 0)
goto no_res_check;
for (;;) { for (;;) {
test = saved; test = saved;
if (test < cval->max) if (test < cval->max)
...@@ -1249,6 +1250,7 @@ static int get_min_max_with_quirks(struct usb_mixer_elem_info *cval, ...@@ -1249,6 +1250,7 @@ static int get_min_max_with_quirks(struct usb_mixer_elem_info *cval,
snd_usb_set_cur_mix_value(cval, minchn, 0, saved); snd_usb_set_cur_mix_value(cval, minchn, 0, saved);
} }
no_res_check:
cval->initialized = 1; cval->initialized = 1;
} }
......
...@@ -248,8 +248,8 @@ static int create_yamaha_midi_quirk(struct snd_usb_audio *chip, ...@@ -248,8 +248,8 @@ static int create_yamaha_midi_quirk(struct snd_usb_audio *chip,
NULL, USB_MS_MIDI_OUT_JACK); NULL, USB_MS_MIDI_OUT_JACK);
if (!injd && !outjd) if (!injd && !outjd)
return -ENODEV; return -ENODEV;
if (!(injd && snd_usb_validate_midi_desc(injd)) || if ((injd && !snd_usb_validate_midi_desc(injd)) ||
!(outjd && snd_usb_validate_midi_desc(outjd))) (outjd && !snd_usb_validate_midi_desc(outjd)))
return -ENODEV; return -ENODEV;
if (injd && (injd->bLength < 5 || if (injd && (injd->bLength < 5 ||
(injd->bJackType != USB_MS_EMBEDDED && (injd->bJackType != USB_MS_EMBEDDED &&
......
...@@ -81,9 +81,9 @@ static bool validate_processing_unit(const void *p, ...@@ -81,9 +81,9 @@ static bool validate_processing_unit(const void *p,
switch (v->protocol) { switch (v->protocol) {
case UAC_VERSION_1: case UAC_VERSION_1:
default: default:
/* bNrChannels, wChannelConfig, iChannelNames, bControlSize */ /* bNrChannels, wChannelConfig, iChannelNames */
len += 1 + 2 + 1 + 1; len += 1 + 2 + 1;
if (d->bLength < len) /* bControlSize */ if (d->bLength < len + 1) /* bControlSize */
return false; return false;
m = hdr[len]; m = hdr[len];
len += 1 + m + 1; /* bControlSize, bmControls, iProcessing */ len += 1 + m + 1; /* bControlSize, bmControls, iProcessing */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment