summaryrefslogtreecommitdiffstats
path: root/sound/isa
diff options
context:
space:
mode:
authorArnd Bergmann <arnd@arndb.de>2017-07-18 07:48:05 -0400
committerTakashi Iwai <tiwai@suse.de>2017-07-18 11:51:55 -0400
commit6d8b04de87e1d736dad0ce7079e0ea112ab160c3 (patch)
tree86154aaecf552c8888aea1f17d9c12c586a680ba /sound/isa
parent8a463639db5781ed52c972db013eba7d834f440d (diff)
ALSA: cs423x: fix format string overflow warning
The snd_pcm name may overflow the card->longname total size: sound/isa/cs423x/cs4231.c: In function 'snd_cs4231_probe': sound/isa/cs423x/cs4231.c:115:26: error: ' at 0x' directive writing 6 bytes into a region of size between 1 and 80 [-Werror=format-overflow=] 0x%lx, irq %d, dma %d", sprintf(card->longname, "%s at 0x%lx, irq %d, dma %d", ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~ This changes the driver to use snprintf() so we truncate the string instead of overflowing into the next field if that happens. I decided to split out the second format string for the extra DMA channel to keep the code simpler. Signed-off-by: Arnd Bergmann <arnd@arndb.de> Signed-off-by: Takashi Iwai <tiwai@suse.de>
Diffstat (limited to 'sound/isa')
-rw-r--r--sound/isa/cs423x/cs4231.c18
-rw-r--r--sound/isa/cs423x/cs4236.c20
2 files changed, 22 insertions, 16 deletions
diff --git a/sound/isa/cs423x/cs4231.c b/sound/isa/cs423x/cs4231.c
index e8edd9017a2f..d90ab9558f7f 100644
--- a/sound/isa/cs423x/cs4231.c
+++ b/sound/isa/cs423x/cs4231.c
@@ -109,13 +109,17 @@ static int snd_cs4231_probe(struct device *dev, unsigned int n)
109 if (error < 0) 109 if (error < 0)
110 goto out; 110 goto out;
111 111
112 strcpy(card->driver, "CS4231"); 112 strlcpy(card->driver, "CS4231", sizeof(card->driver));
113 strcpy(card->shortname, chip->pcm->name); 113 strlcpy(card->shortname, chip->pcm->name, sizeof(card->shortname));
114 114
115 sprintf(card->longname, "%s at 0x%lx, irq %d, dma %d", 115 if (dma2[n] < 0)
116 chip->pcm->name, chip->port, irq[n], dma1[n]); 116 snprintf(card->longname, sizeof(card->longname),
117 if (dma2[n] >= 0) 117 "%s at 0x%lx, irq %d, dma %d",
118 sprintf(card->longname + strlen(card->longname), "&%d", dma2[n]); 118 chip->pcm->name, chip->port, irq[n], dma1[n]);
119 else
120 snprintf(card->longname, sizeof(card->longname),
121 "%s at 0x%lx, irq %d, dma %d&%d",
122 chip->pcm->name, chip->port, irq[n], dma1[n], dma2[n]);
119 123
120 error = snd_wss_mixer(chip); 124 error = snd_wss_mixer(chip);
121 if (error < 0) 125 if (error < 0)
diff --git a/sound/isa/cs423x/cs4236.c b/sound/isa/cs423x/cs4236.c
index 1f9a3b2be7a1..4c09756c7353 100644
--- a/sound/isa/cs423x/cs4236.c
+++ b/sound/isa/cs423x/cs4236.c
@@ -419,15 +419,17 @@ static int snd_cs423x_probe(struct snd_card *card, int dev)
419 if (err < 0) 419 if (err < 0)
420 return err; 420 return err;
421 } 421 }
422 strcpy(card->driver, chip->pcm->name); 422 strlcpy(card->driver, chip->pcm->name, sizeof(card->driver));
423 strcpy(card->shortname, chip->pcm->name); 423 strlcpy(card->shortname, chip->pcm->name, sizeof(card->shortname));
424 sprintf(card->longname, "%s at 0x%lx, irq %i, dma %i", 424 if (dma2[dev] < 0)
425 chip->pcm->name, 425 snprintf(card->longname, sizeof(card->longname),
426 chip->port, 426 "%s at 0x%lx, irq %i, dma %i",
427 irq[dev], 427 chip->pcm->name, chip->port, irq[dev], dma1[dev]);
428 dma1[dev]); 428 else
429 if (dma2[dev] >= 0) 429 snprintf(card->longname, sizeof(card->longname),
430 sprintf(card->longname + strlen(card->longname), "&%d", dma2[dev]); 430 "%s at 0x%lx, irq %i, dma %i&%d",
431 chip->pcm->name, chip->port, irq[dev], dma1[dev],
432 dma2[dev]);
431 433
432 err = snd_wss_timer(chip, 0); 434 err = snd_wss_timer(chip, 0);
433 if (err < 0) 435 if (err < 0)