Patch "ALSA: usb-audio: Fix double-free in error paths after snd_usb_add_audio_stream() call" has been added to the 3.14-stable tree
Subsystems (2)
This is a note to let you know that I've just added the patch titled
ALSA: usb-audio: Fix double-free in error paths after snd_usb_add_audio_stream() call
to the 3.14-stable tree which can be found at:
http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary
The filename of the patch is:
alsa-usb-audio-fix-double-free-in-error-paths-after-snd_usb_add_audio_stream-call.patch
and it can be found in the queue-3.14 subdirectory.
If you, or anyone else, feels it should not be added to the stable tree, please let <[email protected]> know about it.
Quoted 1 line
From
836b34a935abc91e13e63053d0a83b24dfb5ea78Mon Sep 17 00:00:00 2001
From: Vladis Dronov <[email protected]>
Date: Thu, 31 Mar 2016 12:05:43 -0400
Subject: ALSA: usb-audio: Fix double-free in error paths after snd_usb_add_audio_stream() call
From: Vladis Dronov <[email protected]>
commit 836b34a935abc91e13e63053d0a83b24dfb5ea78 upstream.
create_fixed_stream_quirk(), snd_usb_parse_audio_interface() and create_uaxx_quirk() functions allocate the audioformat object by themselves and free it upon error before returning. However, once the object is linked to a stream, it's freed again in snd_usb_audio_pcm_free(), thus it'll be double-freed, eventually resulting in a memory corruption.
This patch fixes these failures in the error paths by unlinking the audioformat object before freeing it.
Based on a patch by Takashi Iwai <[email protected]>
[Note for stable backports:
this patch requires the commit 902eb7fd1e4a ('ALSA: usb-audio: Minor code cleanup in create_fixed_stream_quirk()')]
Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1283358
--- sound/usb/quirks.c | 4 ++++ sound/usb/stream.c | 6 +++++- 2 files changed, 9 insertions(+), 1 deletion(-)
sound/usb/quirks.c +4 -0
@@ -138,6 +138,7 @@ static int create_fixed_stream_quirk(strsnd_printk (KERN_ERR "cannot memdup\n" );return -ENOMEM ; } +INIT_LIST_HEAD (&fp->list);if (fp->nr_rates >MAX_NR_RATES ) {kfree (fp);return -EINVAL ;
@@ -181,6 +182,7 @@ static int create_fixed_stream_quirk(strreturn 0 ; error: +list_del (&fp->list);/* unlink for avoiding double-free */ kfree (fp);kfree (rate_table);return err;
@@ -456,6 +458,7 @@ static int create_uaxx_quirk(struct snd_ fp->ep_attr =get_endpoint (alts,0 )->bmAttributes; fp->datainterval =0 ; fp->maxpacksize =le16_to_cpu (get_endpoint (alts,0 )->wMaxPacketSize); +INIT_LIST_HEAD (&fp->list);switch (fp->maxpacksize) {case 0x120 :
@@ -479,6 +482,7 @@ static int create_uaxx_quirk(struct snd_ ? SNDRV_PCM_STREAM_CAPTURE : SNDRV_PCM_STREAM_PLAYBACK; err =snd_usb_add_audio_stream (chip, stream, fp);if (err <0 ) { +list_del (&fp->list);/* unlink for avoiding double-free */ kfree (fp);return err; }
sound/usb/stream.c +5 -1
@@ -315,7 +315,9 @@ static struct snd_pcm_chmap_elem *conver/* * add this endpoint to the chip instance. * if a stream with the same endpoint already exists, append to it. -* if not, create a new pcm stream. +* if not, create a new pcm stream. note, fp is added to the substream +* fmt_list and will be freed on the chip instance release. do not free +* fp or do remove it from the substream fmt_list to avoid double-free. */ int snd_usb_add_audio_stream(struct snd_usb_audio *chip, int stream,
@@ -662,6 +664,7 @@ int snd_usb_parse_audio_interface(struct * (fp->maxpacksize &0x7ff ); fp->attributes =parse_uac_endpoint_attributes (chip, alts, protocol, iface_no); fp->clock = clock; +INIT_LIST_HEAD (&fp->list);/* some quirks for attributes here */
@@ -710,6 +713,7 @@ int snd_usb_parse_audio_interface(structsnd_printdd (KERN_INFO "%d:%u:%d: add audio endpoint %#x\n" , dev->devnum, iface_no, altno, fp->endpoint); err =snd_usb_add_audio_stream (chip, stream, fp);if (err <0 ) { +list_del (&fp->list);/* unlink for avoiding double-free */ kfree (fp->rate_table);kfree (fp->chmap);kfree (fp);
Patches currently in stable-queue which might be from [email protected] are
queue-3.14/alsa-usb-audio-fix-double-free-in-error-paths-after-snd_usb_add_audio_stream-call.patch