diff options
author | Arnd Bergmann <arnd@arndb.de> | 2017-07-18 07:48:05 -0400 |
---|---|---|
committer | Takashi Iwai <tiwai@suse.de> | 2017-07-18 11:51:55 -0400 |
commit | 6d8b04de87e1d736dad0ce7079e0ea112ab160c3 (patch) | |
tree | 86154aaecf552c8888aea1f17d9c12c586a680ba /sound/isa | |
parent | 8a463639db5781ed52c972db013eba7d834f440d (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.c | 18 | ||||
-rw-r--r-- | sound/isa/cs423x/cs4236.c | 20 |
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) |