ALSA: usb-audio: fix oops due to cleanup race when disconnecting
authorTakashi Iwai <tiwai@suse.de>
Tue, 22 Feb 2011 09:21:18 +0000 (10:21 +0100)
committerGreg Kroah-Hartman <gregkh@suse.de>
Mon, 7 Mar 2011 23:05:15 +0000 (15:05 -0800)
commite770095afdbd2dab6d3b48f1feedba2880dd4fd0
tree6382ab497a9b716a9f13eb29e79e43fe296acf92
parent1e90d1bbd00a32b873cf511fb2521e8912f20ff3
ALSA: usb-audio: fix oops due to cleanup race when disconnecting

commit 382225e62bdb8059b7f915b133426425516dd300 upstream.

When a USB audio device is disconnected, snd_usb_audio_disconnect()
kills all audio URBs.  At the same time, the application, after being
notified of the disconnection, might close the device, in which case
ALSA calls the .hw_free callback, which should free the URBs too.

Commit de1b8b93a0ba "[ALSA] Fix hang-up at disconnection of usb-audio"
prevented snd_usb_hw_free() from freeing the URBs to avoid a hang that
resulted from this race, but this introduced another race because the
URB callbacks could now be executed after snd_usb_hw_free() has
returned, and try to access already freed data.

Fix the first race by introducing a mutex to serialize the disconnect
callback and all PCM callbacks that manage URBs (hw_free and hw_params).

Reported-and-tested-by: Pierre-Louis Bossart <pierre-louis.bossart@intel.com>
[CL: also serialize hw_params callback]
Signed-off-by: Clemens Ladisch <clemens@ladisch.de>
Signed-off-by: Takashi Iwai <tiwai@suse.de>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
sound/usb/card.c
sound/usb/pcm.c
sound/usb/usbaudio.h