[alsa-devel] ALSA become "Segmentation fault" on current linus tree

Takashi Iwai tiwai at suse.de
Tue Jul 5 09:33:14 CEST 2011

At Tue, 05 Jul 2011 00:12:04 -0700 (PDT),
kuninori.morimoto.gx at renesas.com wrote:
> Dear Mark, Liam
> These are fsi-xxx card name fixup patches.
> It are needed for current linus tree.
> Kuninori Morimoto (3):
>       ASoC: sh: fsi-ak4642: fixup snd_soc_card name
>       ASoC: sh: fsi-da7210: fixup snd_soc_card name
>       ASoC: sh: fsi-hdmi: fixup snd_soc_card name

The name string itself is allowed to contain spaces or other special
letters.  These are copied to longname and shortname.
But the driver_name string isn't, and the problem is to reuse the same
string for it.

Since no driver sets driver_name string yet, a better fix would be
to keep it empty like the earlier version.  The revised patch below.


From: Takashi Iwai <tiwai at suse.de>
Subject: [PATCH] ASoC: Don't set invalid name string to snd_card->driver

The snd_card->driver field contains a driver name string, and in
general it shouldn't contain space or special letters.  The commit
2b39535b9e54888649923beaab443af212b6c0fd changed the string copy from
card->name, but the long name string may contain such letters, thus
it may still lead to a segfault.

A temporary fix is not to copy the long name string but just keep it
empty as the earlier version did.

Reported-by: Kuninori Morimoto <kuninori.morimoto.gx at renesas.com>
Signed-off-by: Takashi Iwai <tiwai at suse.de>
 sound/soc/soc-core.c |    5 +++--
 1 files changed, 3 insertions(+), 2 deletions(-)

diff --git a/sound/soc/soc-core.c b/sound/soc/soc-core.c
index d75043e..b194be0 100644
--- a/sound/soc/soc-core.c
+++ b/sound/soc/soc-core.c
@@ -1929,8 +1929,9 @@ static void snd_soc_instantiate_card(struct snd_soc_card *card)
 		 "%s", card->name);
 	snprintf(card->snd_card->longname, sizeof(card->snd_card->longname),
 		 "%s", card->long_name ? card->long_name : card->name);
-	snprintf(card->snd_card->driver, sizeof(card->snd_card->driver),
-		 "%s", card->driver_name ? card->driver_name : card->name);
+	if (card->driver_name)
+		strlcpy(card->snd_card->driver, card->driver_name,
+			sizeof(card->snd_card->driver));
 	if (card->late_probe) {
 		ret = card->late_probe(card);

More information about the Alsa-devel mailing list