* Re: Oops in sound/usb/pcm.c:match_endpoint_audioformats() in current -git
[not found] <50EE7A94.60409@kernel.dk>
@ 2013-01-10 10:21 ` Takashi Iwai
2013-01-10 12:49 ` Jens Axboe
0 siblings, 1 reply; 9+ messages in thread
From: Takashi Iwai @ 2013-01-10 10:21 UTC (permalink / raw)
To: Jens Axboe; +Cc: perex, eldad, alsa-devel, linux-kernel@vger.kernel.org
At Thu, 10 Jan 2013 09:23:48 +0100,
Jens Axboe wrote:
>
> Hi,
>
> I have a USB DAC that I use for music. Just upgraded my workstation from
> 3.7-rc7 to 3.8-rc3 this morning, and when the DAC is switched on, I get
> an immediate oops. I have attached the picture. It's crashing here:
>
> (gdb) l *snd_usb_pcm_prepare+0x153
> 0x161c is in snd_usb_pcm_prepare (sound/usb/pcm.c:470).
> 465 snd_pcm_format_t pcm_format)
> 466 {
> 467 int i;
> 468 int score = 0;
> 469
> 470 if (fp->channels < 1) {
> 471 snd_printdd("%s: (fmt @%p) no channels\n", __func__, fp);
> 472 return 0;
> 473 }
> 474
>
> 'fp' is clearly NULL.
Hmm... it's a function called only from a single place in
configure_sync_endpoint() and it's in list_for_each_entry():
list_for_each_entry(fp, &sync_subs->fmt_list, list) {
int score = match_endpoint_audioformats(fp, subs->cur_audiofmt,
subs->cur_rate, subs->pcm_format);
so it must be hardly NULL in normal situations.
The only scenario I can imagine right now is that the whole structure
is still uninitialized while it's called. If so, it's a race problem,
and shouldn't be new to 3.8. A patch like below might paper over the
problem although it's far from perfect.
> Let me know if you want a bisect.
Yeah, that'll be really helpful.
Or, at least, could you try to copy sound/usb/* from 3.7 to 3.8 and
see whether it's really a regression there?
thanks,
Takashi
---
diff --git a/sound/usb/stream.c b/sound/usb/stream.c
index ad181d5..3bfc564 100644
--- a/sound/usb/stream.c
+++ b/sound/usb/stream.c
@@ -81,8 +81,7 @@ static void snd_usb_audio_pcm_free(struct snd_pcm *pcm)
*/
static void snd_usb_init_substream(struct snd_usb_stream *as,
- int stream,
- struct audioformat *fp)
+ int stream)
{
struct snd_usb_substream *subs = &as->substream[stream];
@@ -96,6 +95,13 @@ static void snd_usb_init_substream(struct snd_usb_stream *as,
subs->speed = snd_usb_get_speed(subs->dev);
snd_usb_set_pcm_ops(as->pcm, stream);
+}
+
+static void snd_usb_add_substream_format(struct snd_usb_stream *as,
+ int stream,
+ struct audioformat *fp)
+{
+ struct snd_usb_substream *subs = &as->substream[stream];
list_add_tail(&fp->list, &subs->fmt_list);
subs->formats |= fp->formats;
@@ -342,7 +348,7 @@ int snd_usb_add_audio_stream(struct snd_usb_audio *chip,
err = snd_pcm_new_stream(as->pcm, stream, 1);
if (err < 0)
return err;
- snd_usb_init_substream(as, stream, fp);
+ snd_usb_add_substream_format(as, stream, fp);
return add_chmap(as->pcm, stream, subs);
}
@@ -370,7 +376,9 @@ int snd_usb_add_audio_stream(struct snd_usb_audio *chip,
else
strcpy(pcm->name, "USB Audio");
- snd_usb_init_substream(as, stream, fp);
+ snd_usb_init_substream(as, SNDRV_PCM_STREAM_PLAYBACK);
+ snd_usb_init_substream(as, SNDRV_PCM_STREAM_CAPTURE);
+ snd_usb_add_substream_format(as, stream, fp);
list_add(&as->list, &chip->pcm_list);
chip->pcm_devs++;
^ permalink raw reply related [flat|nested] 9+ messages in thread
* Re: Oops in sound/usb/pcm.c:match_endpoint_audioformats() in current -git
2013-01-10 10:21 ` Oops in sound/usb/pcm.c:match_endpoint_audioformats() in current -git Takashi Iwai
@ 2013-01-10 12:49 ` Jens Axboe
2013-01-10 13:46 ` Takashi Iwai
0 siblings, 1 reply; 9+ messages in thread
From: Jens Axboe @ 2013-01-10 12:49 UTC (permalink / raw)
To: Takashi Iwai; +Cc: perex, eldad, alsa-devel, linux-kernel@vger.kernel.org
On 2013-01-10 11:21, Takashi Iwai wrote:
> At Thu, 10 Jan 2013 09:23:48 +0100,
> Jens Axboe wrote:
>>
>> Hi,
>>
>> I have a USB DAC that I use for music. Just upgraded my workstation from
>> 3.7-rc7 to 3.8-rc3 this morning, and when the DAC is switched on, I get
>> an immediate oops. I have attached the picture. It's crashing here:
>>
>> (gdb) l *snd_usb_pcm_prepare+0x153
>> 0x161c is in snd_usb_pcm_prepare (sound/usb/pcm.c:470).
>> 465 snd_pcm_format_t pcm_format)
>> 466 {
>> 467 int i;
>> 468 int score = 0;
>> 469
>> 470 if (fp->channels < 1) {
>> 471 snd_printdd("%s: (fmt @%p) no channels\n", __func__, fp);
>> 472 return 0;
>> 473 }
>> 474
>>
>> 'fp' is clearly NULL.
>
> Hmm... it's a function called only from a single place in
> configure_sync_endpoint() and it's in list_for_each_entry():
>
> list_for_each_entry(fp, &sync_subs->fmt_list, list) {
> int score = match_endpoint_audioformats(fp, subs->cur_audiofmt,
> subs->cur_rate, subs->pcm_format);
>
> so it must be hardly NULL in normal situations.
> The only scenario I can imagine right now is that the whole structure
> is still uninitialized while it's called. If so, it's a race problem,
> and shouldn't be new to 3.8. A patch like below might paper over the
> problem although it's far from perfect.
>
>
>> Let me know if you want a bisect.
>
> Yeah, that'll be really helpful.
Here it is, it's from the one introducing the audioformat lookup.
Confirmed that 3.8-rc3 with this backed out works fine, too. So should
be fairly confident in that result.
commit 0d9741c0e058e2857fe3fed37975515dc8dcd21d
Author: Eldad Zack <eldad@fogrefinery.com>
Date: Mon Dec 3 20:30:09 2012 +0100
ALSA: usb-audio: sync ep init fix for audioformat mismatch
Commit 947d299686aa9cc8aecf749d54e8475c6e498956 , "ALSA: snd-usb:
properly initialize the sync endpoint", while correcting the
initialization of the sync endpoint when opening just the data
endpoint, prevents devices that has a sync endpoint, with a channel
number different than that of the data endpoint, from functioning.
Due to a different channel and period bytes count, attempting to
initialize the sync endpoint will fail at the usb host driver.
For example, when using xhci:
cannot submit urb 0, error -90: internal error
With this patch, if a sync endpoint has multiple audioformats, a
matching audioformat is preferred. An audioformat must be found
with at least one channel and support the requested sample rate
and PCM format, otherwise the stream will not be opened.
If the number of channels differ between the selected audioformat
and the requested format, adjust the period bytes count accordingly.
It is safe to perform the calculation on the basis of the channel
count, since the requested PCM audio format and the rate must be
supported by the selected audioformat.
Cc: Jeffrey Barish <jeff_barish@earthlink.net>
Cc: Daniel Mack <zonque@gmail.com>
Signed-off-by: Eldad Zack <eldad@fogrefinery.com>
Signed-off-by: Takashi Iwai <tiwai@suse.de>
diff --git a/sound/usb/pcm.c b/sound/usb/pcm.c
index 769821c..c659310 100644
--- a/sound/usb/pcm.c
+++ b/sound/usb/pcm.c
@@ -454,6 +454,103 @@ add_sync_ep:
}
/*
+ * Return the score of matching two audioformats.
+ * Veto the audioformat if:
+ * - It has no channels for some reason.
+ * - Requested PCM format is not supported.
+ * - Requested sample rate is not supported.
+ */
+static int match_endpoint_audioformats(struct audioformat *fp,
+ struct audioformat *match, int rate,
+ snd_pcm_format_t pcm_format)
+{
+ int i;
+ int score = 0;
+
+ if (fp->channels < 1) {
+ snd_printdd("%s: (fmt @%p) no channels\n", __func__, fp);
+ return 0;
+ }
+
+ if (!(fp->formats & (1ULL << pcm_format))) {
+ snd_printdd("%s: (fmt @%p) no match for format %d\n", __func__,
+ fp, pcm_format);
+ return 0;
+ }
+
+ for (i = 0; i < fp->nr_rates; i++) {
+ if (fp->rate_table[i] == rate) {
+ score++;
+ break;
+ }
+ }
+ if (!score) {
+ snd_printdd("%s: (fmt @%p) no match for rate %d\n", __func__,
+ fp, rate);
+ return 0;
+ }
+
+ if (fp->channels == match->channels)
+ score++;
+
+ snd_printdd("%s: (fmt @%p) score %d\n", __func__, fp, score);
+
+ return score;
+}
+
+/*
+ * Configure the sync ep using the rate and pcm format of the data ep.
+ */
+static int configure_sync_endpoint(struct snd_usb_substream *subs)
+{
+ int ret;
+ struct audioformat *fp;
+ struct audioformat *sync_fp = NULL;
+ int cur_score = 0;
+ int sync_period_bytes = subs->period_bytes;
+ struct snd_usb_substream *sync_subs =
+ &subs->stream->substream[subs->direction ^ 1];
+
+ /* Try to find the best matching audioformat. */
+ list_for_each_entry(fp, &sync_subs->fmt_list, list) {
+ int score = match_endpoint_audioformats(fp, subs->cur_audiofmt,
+ subs->cur_rate, subs->pcm_format);
+
+ if (score > cur_score) {
+ sync_fp = fp;
+ cur_score = score;
+ }
+ }
+
+ if (unlikely(sync_fp == NULL)) {
+ snd_printk(KERN_ERR "%s: no valid audioformat for sync ep %x found\n",
+ __func__, sync_subs->ep_num);
+ return -EINVAL;
+ }
+
+ /*
+ * Recalculate the period bytes if channel number differ between
+ * data and sync ep audioformat.
+ */
+ if (sync_fp->channels != subs->channels) {
+ sync_period_bytes = (subs->period_bytes / subs->channels) *
+ sync_fp->channels;
+ snd_printdd("%s: adjusted sync ep period bytes (%d -> %d)\n",
+ __func__, subs->period_bytes, sync_period_bytes);
+ }
+
+ ret = snd_usb_endpoint_set_params(subs->sync_endpoint,
+ subs->pcm_format,
+ sync_fp->channels,
+ sync_period_bytes,
+ subs->cur_rate,
+ sync_fp,
+ NULL);
+
+ return ret;
+}
+
+/*
* configure endpoint params
*
* called during initial setup and upon resume
@@ -475,13 +572,8 @@ static int configure_endpoint(struct snd_usb_substream *subs)
return ret;
if (subs->sync_endpoint)
- ret = snd_usb_endpoint_set_params(subs->sync_endpoint,
- subs->pcm_format,
- subs->channels,
- subs->period_bytes,
- subs->cur_rate,
- subs->cur_audiofmt,
- NULL);
+ ret = configure_sync_endpoint(subs);
+
return ret;
}
--
Jens Axboe
^ permalink raw reply related [flat|nested] 9+ messages in thread
* Re: Oops in sound/usb/pcm.c:match_endpoint_audioformats() in current -git
2013-01-10 12:49 ` Jens Axboe
@ 2013-01-10 13:46 ` Takashi Iwai
2013-01-10 19:45 ` Eldad Zack
0 siblings, 1 reply; 9+ messages in thread
From: Takashi Iwai @ 2013-01-10 13:46 UTC (permalink / raw)
To: Jens Axboe; +Cc: perex, eldad, alsa-devel, linux-kernel@vger.kernel.org
At Thu, 10 Jan 2013 13:49:22 +0100,
Jens Axboe wrote:
>
> On 2013-01-10 11:21, Takashi Iwai wrote:
> > At Thu, 10 Jan 2013 09:23:48 +0100,
> > Jens Axboe wrote:
> >>
> >> Hi,
> >>
> >> I have a USB DAC that I use for music. Just upgraded my workstation from
> >> 3.7-rc7 to 3.8-rc3 this morning, and when the DAC is switched on, I get
> >> an immediate oops. I have attached the picture. It's crashing here:
> >>
> >> (gdb) l *snd_usb_pcm_prepare+0x153
> >> 0x161c is in snd_usb_pcm_prepare (sound/usb/pcm.c:470).
> >> 465 snd_pcm_format_t pcm_format)
> >> 466 {
> >> 467 int i;
> >> 468 int score = 0;
> >> 469
> >> 470 if (fp->channels < 1) {
> >> 471 snd_printdd("%s: (fmt @%p) no channels\n", __func__, fp);
> >> 472 return 0;
> >> 473 }
> >> 474
> >>
> >> 'fp' is clearly NULL.
> >
> > Hmm... it's a function called only from a single place in
> > configure_sync_endpoint() and it's in list_for_each_entry():
> >
> > list_for_each_entry(fp, &sync_subs->fmt_list, list) {
> > int score = match_endpoint_audioformats(fp, subs->cur_audiofmt,
> > subs->cur_rate, subs->pcm_format);
> >
> > so it must be hardly NULL in normal situations.
> > The only scenario I can imagine right now is that the whole structure
> > is still uninitialized while it's called. If so, it's a race problem,
> > and shouldn't be new to 3.8. A patch like below might paper over the
> > problem although it's far from perfect.
> >
> >
> >> Let me know if you want a bisect.
> >
> > Yeah, that'll be really helpful.
>
> Here it is, it's from the one introducing the audioformat lookup.
> Confirmed that 3.8-rc3 with this backed out works fine, too. So should
> be fairly confident in that result.
Thanks! I'm slowly understanding what's happening there.
Could you try the patch below?
Takashi
---
From: Takashi Iwai <tiwai@suse.de>
Subject: [PATCH] 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-by: Jens Axboe <axboe@kernel.dk>
Signed-off-by: Takashi Iwai <tiwai@suse.de>
---
sound/usb/pcm.c | 11 +++++++++++
1 file changed, 11 insertions(+)
diff --git a/sound/usb/pcm.c b/sound/usb/pcm.c
index c659310..21c0001 100644
--- a/sound/usb/pcm.c
+++ b/sound/usb/pcm.c
@@ -511,6 +511,17 @@ static int configure_sync_endpoint(struct snd_usb_substream *subs)
struct snd_usb_substream *sync_subs =
&subs->stream->substream[subs->direction ^ 1];
+ if (subs->sync_endpoint->type != SND_USB_ENDPOINT_TYPE_DATA ||
+ !subs->stream) {
+ ret = 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. */
list_for_each_entry(fp, &sync_subs->fmt_list, list) {
int score = match_endpoint_audioformats(fp, subs->cur_audiofmt,
--
1.8.1
^ permalink raw reply related [flat|nested] 9+ messages in thread
* Re: Oops in sound/usb/pcm.c:match_endpoint_audioformats() in current -git
2013-01-10 13:46 ` Takashi Iwai
@ 2013-01-10 19:45 ` Eldad Zack
2013-01-10 20:19 ` Takashi Iwai
2013-01-11 7:48 ` Jens Axboe
0 siblings, 2 replies; 9+ messages in thread
From: Eldad Zack @ 2013-01-10 19:45 UTC (permalink / raw)
To: Takashi Iwai; +Cc: Jens Axboe, alsa-devel, linux-kernel@vger.kernel.org
On Thu, 10 Jan 2013, Takashi Iwai wrote:
> At Thu, 10 Jan 2013 13:49:22 +0100,
> Jens Axboe wrote:
> >
> > Here it is, it's from the one introducing the audioformat lookup.
> > Confirmed that 3.8-rc3 with this backed out works fine, too. So should
> > be fairly confident in that result.
> From: Takashi Iwai <tiwai@suse.de>
> Subject: [PATCH] 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.
Yes - sorry, I didn't consider this at all.
> This patch adds a proper check of sync EP type and the presence of the
> paired substream for avoiding the crash.
>
> Reported-by: Jens Axboe <axboe@kernel.dk>
> Signed-off-by: Takashi Iwai <tiwai@suse.de>
> ---
> sound/usb/pcm.c | 11 +++++++++++
> 1 file changed, 11 insertions(+)
>
> diff --git a/sound/usb/pcm.c b/sound/usb/pcm.c
> index c659310..21c0001 100644
> --- a/sound/usb/pcm.c
> +++ b/sound/usb/pcm.c
> @@ -511,6 +511,17 @@ static int configure_sync_endpoint(struct snd_usb_substream *subs)
> struct snd_usb_substream *sync_subs =
> &subs->stream->substream[subs->direction ^ 1];
>
> + if (subs->sync_endpoint->type != SND_USB_ENDPOINT_TYPE_DATA ||
> + !subs->stream) {
> + ret = snd_usb_endpoint_set_params(subs->sync_endpoint,
> + subs->pcm_format,
> + subs->channels,
> + subs->period_bytes,
> + subs->cur_rate,
> + subs->cur_audiofmt,
> + NULL);
> + }
> +
I think you want to return here, no?
Jens, could you please send me the device's descriptors (lsusb -v)?
I'd like to take a closer look at this.
Cheers,
Eldad
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: Oops in sound/usb/pcm.c:match_endpoint_audioformats() in current -git
2013-01-10 19:45 ` Eldad Zack
@ 2013-01-10 20:19 ` Takashi Iwai
2013-01-10 20:26 ` Jens Axboe
2013-01-11 7:47 ` Jens Axboe
2013-01-11 7:48 ` Jens Axboe
1 sibling, 2 replies; 9+ messages in thread
From: Takashi Iwai @ 2013-01-10 20:19 UTC (permalink / raw)
To: Eldad Zack; +Cc: Jens Axboe, perex, alsa-devel, linux-kernel@vger.kernel.org
At Thu, 10 Jan 2013 20:45:02 +0100 (CET),
Eldad Zack wrote:
>
>
> On Thu, 10 Jan 2013, Takashi Iwai wrote:
>
> > At Thu, 10 Jan 2013 13:49:22 +0100,
> > Jens Axboe wrote:
> > >
> > > Here it is, it's from the one introducing the audioformat lookup.
> > > Confirmed that 3.8-rc3 with this backed out works fine, too. So should
> > > be fairly confident in that result.
>
> > From: Takashi Iwai <tiwai@suse.de>
> > Subject: [PATCH] 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.
>
> Yes - sorry, I didn't consider this at all.
>
> > This patch adds a proper check of sync EP type and the presence of the
> > paired substream for avoiding the crash.
> >
> > Reported-by: Jens Axboe <axboe@kernel.dk>
> > Signed-off-by: Takashi Iwai <tiwai@suse.de>
> > ---
> > sound/usb/pcm.c | 11 +++++++++++
> > 1 file changed, 11 insertions(+)
> >
> > diff --git a/sound/usb/pcm.c b/sound/usb/pcm.c
> > index c659310..21c0001 100644
> > --- a/sound/usb/pcm.c
> > +++ b/sound/usb/pcm.c
> > @@ -511,6 +511,17 @@ static int configure_sync_endpoint(struct snd_usb_substream *subs)
> > struct snd_usb_substream *sync_subs =
> > &subs->stream->substream[subs->direction ^ 1];
> >
> > + if (subs->sync_endpoint->type != SND_USB_ENDPOINT_TYPE_DATA ||
> > + !subs->stream) {
> > + ret = snd_usb_endpoint_set_params(subs->sync_endpoint,
> > + subs->pcm_format,
> > + subs->channels,
> > + subs->period_bytes,
> > + subs->cur_rate,
> > + subs->cur_audiofmt,
> > + NULL);
> > + }
> > +
>
> I think you want to return here, no?
Ah, yes, good catch. It was dropped during rebasing and rewriting.
Below is the revised patch.
thanks,
Takashi
---
From: Takashi Iwai <tiwai@suse.de>
Subject: [PATCH v2] 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-by: Jens Axboe <axboe@kernel.dk>
Signed-off-by: Takashi Iwai <tiwai@suse.de>
---
sound/usb/pcm.c | 10 ++++++++++
1 file changed, 10 insertions(+)
diff --git a/sound/usb/pcm.c b/sound/usb/pcm.c
index c659310..d82e378 100644
--- a/sound/usb/pcm.c
+++ b/sound/usb/pcm.c
@@ -511,6 +511,16 @@ static int configure_sync_endpoint(struct snd_usb_substream *subs)
struct snd_usb_substream *sync_subs =
&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. */
list_for_each_entry(fp, &sync_subs->fmt_list, list) {
int score = match_endpoint_audioformats(fp, subs->cur_audiofmt,
--
1.8.1
^ permalink raw reply related [flat|nested] 9+ messages in thread
* Re: Oops in sound/usb/pcm.c:match_endpoint_audioformats() in current -git
2013-01-10 20:19 ` Takashi Iwai
@ 2013-01-10 20:26 ` Jens Axboe
2013-01-11 7:47 ` Jens Axboe
1 sibling, 0 replies; 9+ messages in thread
From: Jens Axboe @ 2013-01-10 20:26 UTC (permalink / raw)
To: Takashi Iwai; +Cc: Eldad Zack, perex, alsa-devel, linux-kernel@vger.kernel.org
On 2013-01-10 21:19, Takashi Iwai wrote:
> At Thu, 10 Jan 2013 20:45:02 +0100 (CET),
> Eldad Zack wrote:
>>
>>
>> On Thu, 10 Jan 2013, Takashi Iwai wrote:
>>
>>> At Thu, 10 Jan 2013 13:49:22 +0100,
>>> Jens Axboe wrote:
>>>>
>>>> Here it is, it's from the one introducing the audioformat lookup.
>>>> Confirmed that 3.8-rc3 with this backed out works fine, too. So should
>>>> be fairly confident in that result.
>>
>>> From: Takashi Iwai <tiwai@suse.de>
>>> Subject: [PATCH] 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.
>>
>> Yes - sorry, I didn't consider this at all.
>>
>>> This patch adds a proper check of sync EP type and the presence of the
>>> paired substream for avoiding the crash.
>>>
>>> Reported-by: Jens Axboe <axboe@kernel.dk>
>>> Signed-off-by: Takashi Iwai <tiwai@suse.de>
>>> ---
>>> sound/usb/pcm.c | 11 +++++++++++
>>> 1 file changed, 11 insertions(+)
>>>
>>> diff --git a/sound/usb/pcm.c b/sound/usb/pcm.c
>>> index c659310..21c0001 100644
>>> --- a/sound/usb/pcm.c
>>> +++ b/sound/usb/pcm.c
>>> @@ -511,6 +511,17 @@ static int configure_sync_endpoint(struct snd_usb_substream *subs)
>>> struct snd_usb_substream *sync_subs =
>>> &subs->stream->substream[subs->direction ^ 1];
>>>
>>> + if (subs->sync_endpoint->type != SND_USB_ENDPOINT_TYPE_DATA ||
>>> + !subs->stream) {
>>> + ret = snd_usb_endpoint_set_params(subs->sync_endpoint,
>>> + subs->pcm_format,
>>> + subs->channels,
>>> + subs->period_bytes,
>>> + subs->cur_rate,
>>> + subs->cur_audiofmt,
>>> + NULL);
>>> + }
>>> +
>>
>> I think you want to return here, no?
>
> Ah, yes, good catch. It was dropped during rebasing and rewriting.
> Below is the revised patch.
Thanks, I'll give it a go and report back.
--
Jens Axboe
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: Oops in sound/usb/pcm.c:match_endpoint_audioformats() in current -git
2013-01-10 20:19 ` Takashi Iwai
2013-01-10 20:26 ` Jens Axboe
@ 2013-01-11 7:47 ` Jens Axboe
2013-01-11 10:17 ` Takashi Iwai
1 sibling, 1 reply; 9+ messages in thread
From: Jens Axboe @ 2013-01-11 7:47 UTC (permalink / raw)
To: Takashi Iwai; +Cc: Eldad Zack, perex, alsa-devel, linux-kernel@vger.kernel.org
On 2013-01-10 21:19, Takashi Iwai wrote:
> From: Takashi Iwai <tiwai@suse.de>
> Subject: [PATCH v2] 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-by: Jens Axboe <axboe@kernel.dk>
> Signed-off-by: Takashi Iwai <tiwai@suse.de>
Confirmed, it works. You can add my tested-by too. Thanks Takashi!
--
Jens Axboe
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: Oops in sound/usb/pcm.c:match_endpoint_audioformats() in current -git
2013-01-10 19:45 ` Eldad Zack
2013-01-10 20:19 ` Takashi Iwai
@ 2013-01-11 7:48 ` Jens Axboe
1 sibling, 0 replies; 9+ messages in thread
From: Jens Axboe @ 2013-01-11 7:48 UTC (permalink / raw)
To: Eldad Zack; +Cc: Takashi Iwai, perex, alsa-devel, linux-kernel@vger.kernel.org
On 2013-01-10 20:45, Eldad Zack wrote:
> Jens, could you please send me the device's descriptors (lsusb -v)?
> I'd like to take a closer look at this.
Below.
Bus 006 Device 010: ID 22e8:dac1
Device Descriptor:
bLength 18
bDescriptorType 1
bcdUSB 1.00
bDeviceClass 0 (Defined at Interface level)
bDeviceSubClass 0
bDeviceProtocol 0
bMaxPacketSize0 64
idVendor 0x22e8
idProduct 0xdac1
bcdDevice 3.21
iManufacturer 1 Cambridge Audio
iProduct 2 Cambridge Audio USB Audio 1.0
iSerial 3 0000
bNumConfigurations 1
Configuration Descriptor:
bLength 9
bDescriptorType 2
wTotalLength 128
bNumInterfaces 2
bConfigurationValue 1
iConfiguration 0
bmAttributes 0x80
(Bus Powered)
MaxPower 500mA
Interface Descriptor:
bLength 9
bDescriptorType 4
bInterfaceNumber 0
bAlternateSetting 0
bNumEndpoints 0
bInterfaceClass 1 Audio
bInterfaceSubClass 1 Control Device
bInterfaceProtocol 0
iInterface 2 Cambridge Audio USB Audio 1.0
AudioControl Interface Descriptor:
bLength 9
bDescriptorType 36
bDescriptorSubtype 1 (HEADER)
bcdADC 1.00
wTotalLength 40
bInCollection 1
baInterfaceNr( 0) 1
AudioControl Interface Descriptor:
bLength 12
bDescriptorType 36
bDescriptorSubtype 2 (INPUT_TERMINAL)
bTerminalID 1
wTerminalType 0x0101 USB Streaming
bAssocTerminal 0
bNrChannels 2
wChannelConfig 0x0003
Left Front (L)
Right Front (R)
iChannelNames 0
iTerminal 6 Cambridge Audio Audio 1.0 Output
AudioControl Interface Descriptor:
bLength 10
bDescriptorType 36
bDescriptorSubtype 6 (FEATURE_UNIT)
bUnitID 10
bSourceID 1
bControlSize 1
bmaControls( 0) 0x01
Mute Control
bmaControls( 1) 0x01
Mute Control
bmaControls( 2) 0x01
Mute Control
iFeature 5 Cambridge Audio USB 1.0 Audio In
AudioControl Interface Descriptor:
bLength 9
bDescriptorType 36
bDescriptorSubtype 3 (OUTPUT_TERMINAL)
bTerminalID 6
wTerminalType 0x0301 Speaker
bAssocTerminal 0
bSourceID 10
iTerminal 0
Interface Descriptor:
bLength 9
bDescriptorType 4
bInterfaceNumber 1
bAlternateSetting 0
bNumEndpoints 0
bInterfaceClass 1 Audio
bInterfaceSubClass 2 Streaming
bInterfaceProtocol 0
iInterface 4 Cambridge Audio USB 1.0 Audio Out
Interface Descriptor:
bLength 9
bDescriptorType 4
bInterfaceNumber 1
bAlternateSetting 1
bNumEndpoints 2
bInterfaceClass 1 Audio
bInterfaceSubClass 2 Streaming
bInterfaceProtocol 0
iInterface 4 Cambridge Audio USB 1.0 Audio Out
AudioStreaming Interface Descriptor:
bLength 7
bDescriptorType 36
bDescriptorSubtype 1 (AS_GENERAL)
bTerminalLink 1
bDelay 1 frames
wFormatTag 1 PCM
AudioStreaming Interface Descriptor:
bLength 20
bDescriptorType 36
bDescriptorSubtype 2 (FORMAT_TYPE)
bFormatType 1 (FORMAT_TYPE_I)
bNrChannels 2
bSubframeSize 3
bBitResolution 24
bSamFreqType 4 Discrete
tSamFreq[ 0] 44100
tSamFreq[ 1] 48000
tSamFreq[ 2] 88200
tSamFreq[ 3] 96000
Endpoint Descriptor:
bLength 9
bDescriptorType 5
bEndpointAddress 0x01 EP 1 OUT
bmAttributes 5
Transfer Type Isochronous
Synch Type Asynchronous
Usage Type Data
wMaxPacketSize 0x0246 1x 582 bytes
bInterval 1
bRefresh 0
bSynchAddress 129
AudioControl Endpoint Descriptor:
bLength 7
bDescriptorType 37
bDescriptorSubtype 1 (EP_GENERAL)
bmAttributes 0x01
Sampling Frequency
bLockDelayUnits 2 Decoded PCM samples
wLockDelay 0 Decoded PCM samples
Endpoint Descriptor:
bLength 9
bDescriptorType 5
bEndpointAddress 0x81 EP 1 IN
bmAttributes 1
Transfer Type Isochronous
Synch Type None
Usage Type Data
wMaxPacketSize 0x0003 1x 3 bytes
bInterval 1
bRefresh 4
bSynchAddress 0
Device Status: 0x0000
(Bus Powered)
--
Jens Axboe
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: Oops in sound/usb/pcm.c:match_endpoint_audioformats() in current -git
2013-01-11 7:47 ` Jens Axboe
@ 2013-01-11 10:17 ` Takashi Iwai
0 siblings, 0 replies; 9+ messages in thread
From: Takashi Iwai @ 2013-01-11 10:17 UTC (permalink / raw)
To: Jens Axboe; +Cc: Eldad Zack, perex, alsa-devel, linux-kernel@vger.kernel.org
At Fri, 11 Jan 2013 08:47:25 +0100,
Jens Axboe wrote:
>
> On 2013-01-10 21:19, Takashi Iwai wrote:
> > From: Takashi Iwai <tiwai@suse.de>
> > Subject: [PATCH v2] 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-by: Jens Axboe <axboe@kernel.dk>
> > Signed-off-by: Takashi Iwai <tiwai@suse.de>
>
> Confirmed, it works. You can add my tested-by too. Thanks Takashi!
Thanks for quick testing. Applied it now.
Takashi
^ permalink raw reply [flat|nested] 9+ messages in thread
end of thread, other threads:[~2013-01-11 10:17 UTC | newest]
Thread overview: 9+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
[not found] <50EE7A94.60409@kernel.dk>
2013-01-10 10:21 ` Oops in sound/usb/pcm.c:match_endpoint_audioformats() in current -git Takashi Iwai
2013-01-10 12:49 ` Jens Axboe
2013-01-10 13:46 ` Takashi Iwai
2013-01-10 19:45 ` Eldad Zack
2013-01-10 20:19 ` Takashi Iwai
2013-01-10 20:26 ` Jens Axboe
2013-01-11 7:47 ` Jens Axboe
2013-01-11 10:17 ` Takashi Iwai
2013-01-11 7:48 ` Jens Axboe
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).