提交 31be5425 编写于 作者: T Takashi Iwai

ALSA: usb-audio: Fix NULL dereference by access to non-existing substream

The commit [0d9741c0: ALSA: usb-audio: sync ep init fix for
audioformat mismatch] introduced the correction of parameters to be
set for sync EP.  But since the new code assumes that the sync EP is
always paired with the data EP of another direction, it triggers Oops
when a device only with a single direction is used.

This patch adds a proper check of sync EP type and the presence of the
paired substream for avoiding the crash.
Reported-and-tested-by: NJens Axboe <axboe@kernel.dk>
Signed-off-by: NTakashi Iwai <tiwai@suse.de>
上级 c18ab0ba
...@@ -511,6 +511,16 @@ static int configure_sync_endpoint(struct snd_usb_substream *subs) ...@@ -511,6 +511,16 @@ static int configure_sync_endpoint(struct snd_usb_substream *subs)
struct snd_usb_substream *sync_subs = struct snd_usb_substream *sync_subs =
&subs->stream->substream[subs->direction ^ 1]; &subs->stream->substream[subs->direction ^ 1];
if (subs->sync_endpoint->type != SND_USB_ENDPOINT_TYPE_DATA ||
!subs->stream)
return snd_usb_endpoint_set_params(subs->sync_endpoint,
subs->pcm_format,
subs->channels,
subs->period_bytes,
subs->cur_rate,
subs->cur_audiofmt,
NULL);
/* Try to find the best matching audioformat. */ /* Try to find the best matching audioformat. */
list_for_each_entry(fp, &sync_subs->fmt_list, list) { list_for_each_entry(fp, &sync_subs->fmt_list, list) {
int score = match_endpoint_audioformats(fp, subs->cur_audiofmt, int score = match_endpoint_audioformats(fp, subs->cur_audiofmt,
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册