[alsa-devel] [PATCH] possible race with /proc/asound symlinks in core/info.c
Takashi Iwai
tiwai at suse.de
Tue Feb 24 18:07:02 CET 2009
At Tue, 24 Feb 2009 10:50:35 -0600,
Brad Bosch wrote:
>
> Takashi Iwai writes:
> > Thanks for the patch! I'm very interested in whether the problem
> > happens with the very same scenario in the latest driver code.
> > There are still a few (but rare) bug reports, supposedly happening
> > with the same use-case. But, the disconnection code was largely
> > changed since 2.6.5, it's not clear at all whether it's the same
> > cause or not.
>
> If the oops stack trace for these bug reports looks something like
> this, I'd guess there may still be a race which allows this bug:
>
> Unable to handle kernel NULL pointer dereference at virtual address 0000004c
> printing eip:
> 02166027
> *pde = 00000000
> Oops: 0000 [#1]
> PREEMPT
> CPU: 0
> EIP: 0060:[<02166027>] Tainted: P
> EFLAGS: 00010286 (2.6.5-1.358pt)
> EIP is at remove_proc_entry+0x34/0xe5
> eax: 00000000 ebx: 3f87bc94 ecx: ffffffff edx: 0000004c
> esi: 154fca64 edi: 0000004c ebp: 41fa9ed8 esp: 41fa9ec8
> ds: 007b es: 007b ss: 0068
> Process events/0 (pid: 3, threadinfo=41fa9000 task=03f2eb50)
> Stack: 0000004c 3f87bc94 154fca64 00000001 41fa9ef8 431c9b09 0000004c 37ddd8c0
> 431cece5 3f87bc94 0000004c 154fca64 41fa9f0c 431ca648 37ddd8c0 3f87bc94
> 154fca64 41fa9f40 431c8cad 154fca64 00000000 03f2eb50 02111205 00100100
> Call Trace:
> [<431c9b09>] snd_remove_proc_entry+0x24/0x3c [snd]
> [<431ca648>] snd_info_card_free+0x7d/0xab [snd]
> [<431c8cad>] snd_card_free+0x17e/0x1f9 [snd]
Unfortunately, not.
It's somewhere in snd_mixer_oss_notify_handler() called in the delayed
snd_card_do_free().
> > Well, the sound core checks the duplicated id string, so I'm wondering
> > where the same id string comes from. Also, the recent kobject handler
> > checks the duplicated entry, and will spew the errors at
> > registration.
>
> Then I wouldn't expect to see the oops above in the latest kernels
> unless something else is deleting the symlink entries in /proc/asound
> But as you point out below, this patch shouldn't cause any trouble and
> I think it is an improvement anyway.
Yep.
> >
> > Yes, the fix sounds sane and likely applicable to the latest code.
> > At least it should be harmless...
> >
> > > This patch won't apply directly to newer kernels because of minor
> > > changes, but it's trivial to apply by hand. Let me know if you need
> > > me to re-base the patch.
> >
> > Yes, please. Then let's queue to the devel tree and see whether
> > any regression occurs actually :)
>
> OK. Here is the patch based on 2.6.28.7. I've applied, built, and
> tested it here and seen no ill effects.
Well, 2.6.29 has a feature to rename id string dynamically, and this
refers to the proc_root_link field. Thus your patch isn't applicable,
unfortunately.
We need a workaround for that, e.g. call snd_info_card_id_change()
before changing card->id...
thanks,
(BTW, it'd be appreciated if you make a diff with -p1 at the next
time.)
Takashi
> Thanks!
>
> --Brad
>
> Signed-off-by: Bradley Bosch <bradbosch at comcast.net>
>
> ChangeLog:
> Avoid caching a pointer to struct proc_dir_entry for the card symbolic
> links in /proc/asound and eliminate the proc_root_link member of
> struct snd_card. This avoids a potential oops should the link ever be
> freed by another card.
>
> --- sound/core/info.c~ 2009-02-20 16:41:27.000000000 -0600
> +++ sound/core/info.c 2009-02-23 18:09:44.000000000 -0600
> @@ -648,7 +648,6 @@ int snd_info_card_register(struct snd_ca
> p = proc_symlink(card->id, snd_proc_root, card->proc_root->name);
> if (p == NULL)
> return -ENOMEM;
> - card->proc_root_link = p;
> return 0;
> }
>
> @@ -661,10 +660,7 @@ void snd_info_card_disconnect(struct snd
> if (!card)
> return;
> mutex_lock(&info_mutex);
> - if (card->proc_root_link) {
> - snd_remove_proc_entry(snd_proc_root, card->proc_root_link);
> - card->proc_root_link = NULL;
> - }
> + remove_proc_entry(card->id, snd_proc_root);
> if (card->proc_root)
> snd_info_disconnect(card->proc_root);
> mutex_unlock(&info_mutex);
> --- include/sound/core.h~ 2009-02-20 16:41:27.000000000 -0600
> +++ include/sound/core.h 2009-02-23 18:10:34.000000000 -0600
> @@ -132,7 +132,6 @@ struct snd_card {
>
> struct snd_info_entry *proc_root; /* root for soundcard specific files */
> struct snd_info_entry *proc_id; /* the card id */
> - struct proc_dir_entry *proc_root_link; /* number link to real id */
>
> struct snd_monitor_file *files; /* all files associated to this card */
> struct snd_shutdown_f_ops *s_f_ops; /* file operations in the shutdown
>
More information about the Alsa-devel
mailing list