]> git.alsa-project.org Git - alsa-lib.git/commitdiff
Fix driver conf parsing in snd_config_hook_load_for_all_cards()
authorTakashi Iwai <tiwai@suse.de>
Mon, 10 Aug 2009 12:11:57 +0000 (14:11 +0200)
committerTakashi Iwai <tiwai@suse.de>
Mon, 10 Aug 2009 12:14:10 +0000 (14:14 +0200)
Reported by Kevin Goodsell.

Summary: load_for_all_cards fails with existing configuration elements

In snd_config_hook_load_for_all_cards, the first call to
snd_config_search attempts to locate an existing configuration node with
the name of the driver.  Typically none is found, and everything is
good. However, if such a node is located, the next line assumes it is a
leaf node with type 'string' and calls snd_config_get_string to fetch
the string value. If this fails, the entire hook is abandoned.

Because of this, setting something like the following in asoundrc:

cards.<driver name>.foo 0

is sufficient to disable the entire card-specific configuration.

As a concrete example, I have a HDA-Intel sound card. dmix.conf includes
a way to set period_size, period_time, and periods by using
configuration elements of the form cards.<driver name>.pcm.dmix.<var>.
In ~/.asoundrc I add

cards.HDA-Intel.pcm.dmix.period_size 1024

This will cause HDA-Intel.conf to fail to load, and the pcm defined in
default.conf will fail to find the device-specific pcm
cards.HDA-Intel.pcm.default, and fall back on the default pcm using
plughw.  By attempting to configure dmix, I have disabled it.

Signed-off-by: Takashi Iwai <tiwai@suse.de>
src/conf.c

index 570c90fa6413779025dd61b329961e7f28c8118d..3f0dfe17e2da3407b49bbc82b6edce9ed9d8fa10 100644 (file)
@@ -3477,9 +3477,8 @@ int snd_config_hook_load_for_all_cards(snd_config_t *root, snd_config_t *config,
                        err = snd_determine_driver(card, &fdriver);
                        if (err < 0)
                                return err;
-                       if (snd_config_search(root, fdriver, &n) >= 0) {
-                               if (snd_config_get_string(n, &driver) < 0)
-                                       goto __err;
+                       if (snd_config_search(root, fdriver, &n) >= 0 &&
+                           snd_config_get_string(n, &driver) >= 0) {
                                assert(driver);
                                while (1) {
                                        char *s = strchr(driver, '.');