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