ALSA: usxy2: Fix potential doubly allocations
authorTakashi Iwai <tiwai@suse.de>
Mon, 17 May 2021 13:15:41 +0000 (15:15 +0200)
committerTakashi Iwai <tiwai@suse.de>
Mon, 17 May 2021 14:04:55 +0000 (16:04 +0200)
The PCM shmem pages are allocated in snd_usx2y_usbpcm_prepare().
Theoretically the prepare callback may be called simultaneously for
both playback and capture, hence this allocation can be racy.

Make sure that the allocation is performed exclusively by extending
the pcm_mutex lock to cover the allocation code, too.

Link: https://lore.kernel.org/r/20210517131545.27252-8-tiwai@suse.de
Signed-off-by: Takashi Iwai <tiwai@suse.de>
sound/usb/usx2y/usx2yhwdeppcm.c

index b988a4870de4671ebefee9ac797e5a86d71293eb..da643c2dbb1200668b079c01a22599bb1c1e2189 100644 (file)
@@ -503,15 +503,18 @@ static int snd_usx2y_usbpcm_prepare(struct snd_pcm_substream *substream)
 
        snd_printdd("snd_usx2y_pcm_prepare(%p)\n", substream);
 
+       mutex_lock(&usx2y->pcm_mutex);
+
        if (!usx2y->hwdep_pcm_shm) {
                usx2y->hwdep_pcm_shm = alloc_pages_exact(USX2Y_HWDEP_PCM_PAGES,
                                                         GFP_KERNEL);
-               if (!usx2y->hwdep_pcm_shm)
-                       return -ENOMEM;
+               if (!usx2y->hwdep_pcm_shm) {
+                       err = -ENOMEM;
+                       goto up_prepare_mutex;
+               }
                memset(usx2y->hwdep_pcm_shm, 0, USX2Y_HWDEP_PCM_PAGES);
        }
 
-       mutex_lock(&usx2y->pcm_mutex);
        usx2y_subs_prepare(subs);
        // Start hardware streams
        // SyncStream first....