runtime->status is initialized with the wrong size (not really, because it's
one page anyway), and an error handler uses the wrong function to free it.

The snd_pcm_notify function already checks that n_register and
n_unregister are set, so we don't need the extra checks in
snd_pcm_dev_(un)register.


Index: core/pcm.c
===================================================================
RCS file: /cvsroot/alsa/alsa-kernel/core/pcm.c,v
retrieving revision 1.14
diff -u -r1.14 pcm.c
--- core/pcm.c  26 Jun 2002 02:02:49 -0000      1.14
+++ core/pcm.c  22 Jul 2002 08:14:46 -0000
@@ -753,16 +753,15 @@
                kfree(runtime);
                return -ENOMEM;
        }
+       memset((void*)runtime->status, 0, size);
 
        size = PAGE_ALIGN(sizeof(snd_pcm_mmap_control_t));
        runtime->control = snd_malloc_pages(size, GFP_KERNEL);
        if (runtime->control == NULL) {
-               kfree((void *)runtime->status);
+               snd_free_pages((void*)runtime->status, 
+PAGE_ALIGN(sizeof(snd_pcm_mmap_status_t)));
                kfree(runtime);
                return -ENOMEM;
        }
-
-       memset((void*)runtime->status, 0, size);
        memset((void*)runtime->control, 0, size);
 
        init_waitqueue_head(&runtime->sleep);
@@ -840,8 +839,7 @@
        list_for_each(list, &snd_pcm_notify_list) {
                snd_pcm_notify_t *notify;
                notify = list_entry(list, snd_pcm_notify_t, list);
-               if (notify->n_register)
-                       notify->n_register(-1 /* idx + SNDRV_MINOR_PCM */, pcm);
+               notify->n_register(-1 /* idx + SNDRV_MINOR_PCM */, pcm);
        }
        snd_pcm_lock(1);
        return 0;
@@ -878,8 +876,7 @@
        list_for_each(list, &snd_pcm_notify_list) {
                snd_pcm_notify_t *notify;
                notify = list_entry(list, snd_pcm_notify_t, list);
-               if (notify->n_unregister)
-                       notify->n_unregister(-1 /* SNDRV_MINOR_PCM + idx */, pcm);
+               notify->n_unregister(-1 /* SNDRV_MINOR_PCM + idx */, pcm);
        }
        snd_pcm_devices[idx] = NULL;
        snd_pcm_lock(1);


-------------------------------------------------------
This sf.net email is sponsored by:ThinkGeek
Welcome to geek heaven.
http://thinkgeek.com/sf
_______________________________________________
Alsa-devel mailing list
[EMAIL PROTECTED]
https://lists.sourceforge.net/lists/listinfo/alsa-devel

Reply via email to