diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2017-12-06 13:49:14 -0500 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2017-12-06 13:49:14 -0500 |
commit | f9efc944474742ad952c15c092a901d88ed83c71 (patch) | |
tree | cbd6e7b4ce3a81301340195385604a62251f309d | |
parent | 328b4ed93b69a6f2083d52f31a240a09e5de386a (diff) | |
parent | 362bca57f5d78220f8b5907b875961af9436e229 (diff) |
Merge tag 'sound-4.15-rc3' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound
Pull sound fixes from Takashi Iwai:
"All fixes are small and for stable:
- a PCM ioctl race fix
- yet another USB-audio hardening for malicious descriptors
- Realtek ALC257 codec support"
* tag 'sound-4.15-rc3' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound:
ALSA: pcm: prevent UAF in snd_pcm_info
ALSA: hda/realtek - New codec support for ALC257
ALSA: usb-audio: Add check return value for usb_string()
ALSA: usb-audio: Fix out-of-bound error
ALSA: seq: Remove spurious WARN_ON() at timer check
-rw-r--r-- | sound/core/pcm.c | 2 | ||||
-rw-r--r-- | sound/core/seq/seq_timer.c | 2 | ||||
-rw-r--r-- | sound/pci/hda/patch_realtek.c | 8 | ||||
-rw-r--r-- | sound/usb/mixer.c | 13 |
4 files changed, 20 insertions, 5 deletions
diff --git a/sound/core/pcm.c b/sound/core/pcm.c index 9070f277f8db..09ee8c6b9f75 100644 --- a/sound/core/pcm.c +++ b/sound/core/pcm.c | |||
@@ -153,7 +153,9 @@ static int snd_pcm_control_ioctl(struct snd_card *card, | |||
153 | err = -ENXIO; | 153 | err = -ENXIO; |
154 | goto _error; | 154 | goto _error; |
155 | } | 155 | } |
156 | mutex_lock(&pcm->open_mutex); | ||
156 | err = snd_pcm_info_user(substream, info); | 157 | err = snd_pcm_info_user(substream, info); |
158 | mutex_unlock(&pcm->open_mutex); | ||
157 | _error: | 159 | _error: |
158 | mutex_unlock(®ister_mutex); | 160 | mutex_unlock(®ister_mutex); |
159 | return err; | 161 | return err; |
diff --git a/sound/core/seq/seq_timer.c b/sound/core/seq/seq_timer.c index 37d9cfbc29f9..b80985fbc334 100644 --- a/sound/core/seq/seq_timer.c +++ b/sound/core/seq/seq_timer.c | |||
@@ -355,7 +355,7 @@ static int initialize_timer(struct snd_seq_timer *tmr) | |||
355 | unsigned long freq; | 355 | unsigned long freq; |
356 | 356 | ||
357 | t = tmr->timeri->timer; | 357 | t = tmr->timeri->timer; |
358 | if (snd_BUG_ON(!t)) | 358 | if (!t) |
359 | return -EINVAL; | 359 | return -EINVAL; |
360 | 360 | ||
361 | freq = tmr->preferred_resolution; | 361 | freq = tmr->preferred_resolution; |
diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c index 921a10eff43a..4b21f71d685c 100644 --- a/sound/pci/hda/patch_realtek.c +++ b/sound/pci/hda/patch_realtek.c | |||
@@ -330,6 +330,7 @@ static void alc_fill_eapd_coef(struct hda_codec *codec) | |||
330 | case 0x10ec0236: | 330 | case 0x10ec0236: |
331 | case 0x10ec0255: | 331 | case 0x10ec0255: |
332 | case 0x10ec0256: | 332 | case 0x10ec0256: |
333 | case 0x10ec0257: | ||
333 | case 0x10ec0282: | 334 | case 0x10ec0282: |
334 | case 0x10ec0283: | 335 | case 0x10ec0283: |
335 | case 0x10ec0286: | 336 | case 0x10ec0286: |
@@ -2772,6 +2773,7 @@ enum { | |||
2772 | ALC269_TYPE_ALC298, | 2773 | ALC269_TYPE_ALC298, |
2773 | ALC269_TYPE_ALC255, | 2774 | ALC269_TYPE_ALC255, |
2774 | ALC269_TYPE_ALC256, | 2775 | ALC269_TYPE_ALC256, |
2776 | ALC269_TYPE_ALC257, | ||
2775 | ALC269_TYPE_ALC215, | 2777 | ALC269_TYPE_ALC215, |
2776 | ALC269_TYPE_ALC225, | 2778 | ALC269_TYPE_ALC225, |
2777 | ALC269_TYPE_ALC294, | 2779 | ALC269_TYPE_ALC294, |
@@ -2805,6 +2807,7 @@ static int alc269_parse_auto_config(struct hda_codec *codec) | |||
2805 | case ALC269_TYPE_ALC298: | 2807 | case ALC269_TYPE_ALC298: |
2806 | case ALC269_TYPE_ALC255: | 2808 | case ALC269_TYPE_ALC255: |
2807 | case ALC269_TYPE_ALC256: | 2809 | case ALC269_TYPE_ALC256: |
2810 | case ALC269_TYPE_ALC257: | ||
2808 | case ALC269_TYPE_ALC215: | 2811 | case ALC269_TYPE_ALC215: |
2809 | case ALC269_TYPE_ALC225: | 2812 | case ALC269_TYPE_ALC225: |
2810 | case ALC269_TYPE_ALC294: | 2813 | case ALC269_TYPE_ALC294: |
@@ -6867,6 +6870,10 @@ static int patch_alc269(struct hda_codec *codec) | |||
6867 | spec->gen.mixer_nid = 0; /* ALC256 does not have any loopback mixer path */ | 6870 | spec->gen.mixer_nid = 0; /* ALC256 does not have any loopback mixer path */ |
6868 | alc_update_coef_idx(codec, 0x36, 1 << 13, 1 << 5); /* Switch pcbeep path to Line in path*/ | 6871 | alc_update_coef_idx(codec, 0x36, 1 << 13, 1 << 5); /* Switch pcbeep path to Line in path*/ |
6869 | break; | 6872 | break; |
6873 | case 0x10ec0257: | ||
6874 | spec->codec_variant = ALC269_TYPE_ALC257; | ||
6875 | spec->gen.mixer_nid = 0; | ||
6876 | break; | ||
6870 | case 0x10ec0215: | 6877 | case 0x10ec0215: |
6871 | case 0x10ec0285: | 6878 | case 0x10ec0285: |
6872 | case 0x10ec0289: | 6879 | case 0x10ec0289: |
@@ -7914,6 +7921,7 @@ static const struct hda_device_id snd_hda_id_realtek[] = { | |||
7914 | HDA_CODEC_ENTRY(0x10ec0236, "ALC236", patch_alc269), | 7921 | HDA_CODEC_ENTRY(0x10ec0236, "ALC236", patch_alc269), |
7915 | HDA_CODEC_ENTRY(0x10ec0255, "ALC255", patch_alc269), | 7922 | HDA_CODEC_ENTRY(0x10ec0255, "ALC255", patch_alc269), |
7916 | HDA_CODEC_ENTRY(0x10ec0256, "ALC256", patch_alc269), | 7923 | HDA_CODEC_ENTRY(0x10ec0256, "ALC256", patch_alc269), |
7924 | HDA_CODEC_ENTRY(0x10ec0257, "ALC257", patch_alc269), | ||
7917 | HDA_CODEC_ENTRY(0x10ec0260, "ALC260", patch_alc260), | 7925 | HDA_CODEC_ENTRY(0x10ec0260, "ALC260", patch_alc260), |
7918 | HDA_CODEC_ENTRY(0x10ec0262, "ALC262", patch_alc262), | 7926 | HDA_CODEC_ENTRY(0x10ec0262, "ALC262", patch_alc262), |
7919 | HDA_CODEC_ENTRY(0x10ec0267, "ALC267", patch_alc268), | 7927 | HDA_CODEC_ENTRY(0x10ec0267, "ALC267", patch_alc268), |
diff --git a/sound/usb/mixer.c b/sound/usb/mixer.c index 61b348383de8..7c9e361b2200 100644 --- a/sound/usb/mixer.c +++ b/sound/usb/mixer.c | |||
@@ -204,6 +204,10 @@ static int snd_usb_copy_string_desc(struct mixer_build *state, | |||
204 | int index, char *buf, int maxlen) | 204 | int index, char *buf, int maxlen) |
205 | { | 205 | { |
206 | int len = usb_string(state->chip->dev, index, buf, maxlen - 1); | 206 | int len = usb_string(state->chip->dev, index, buf, maxlen - 1); |
207 | |||
208 | if (len < 0) | ||
209 | return 0; | ||
210 | |||
207 | buf[len] = 0; | 211 | buf[len] = 0; |
208 | return len; | 212 | return len; |
209 | } | 213 | } |
@@ -2174,13 +2178,14 @@ static int parse_audio_selector_unit(struct mixer_build *state, int unitid, | |||
2174 | if (len) | 2178 | if (len) |
2175 | ; | 2179 | ; |
2176 | else if (nameid) | 2180 | else if (nameid) |
2177 | snd_usb_copy_string_desc(state, nameid, kctl->id.name, | 2181 | len = snd_usb_copy_string_desc(state, nameid, kctl->id.name, |
2178 | sizeof(kctl->id.name)); | 2182 | sizeof(kctl->id.name)); |
2179 | else { | 2183 | else |
2180 | len = get_term_name(state, &state->oterm, | 2184 | len = get_term_name(state, &state->oterm, |
2181 | kctl->id.name, sizeof(kctl->id.name), 0); | 2185 | kctl->id.name, sizeof(kctl->id.name), 0); |
2182 | if (!len) | 2186 | |
2183 | strlcpy(kctl->id.name, "USB", sizeof(kctl->id.name)); | 2187 | if (!len) { |
2188 | strlcpy(kctl->id.name, "USB", sizeof(kctl->id.name)); | ||
2184 | 2189 | ||
2185 | if (desc->bDescriptorSubtype == UAC2_CLOCK_SELECTOR) | 2190 | if (desc->bDescriptorSubtype == UAC2_CLOCK_SELECTOR) |
2186 | append_ctl_name(kctl, " Clock Source"); | 2191 | append_ctl_name(kctl, " Clock Source"); |