ALSA: rme9652: fix format overflow warnings

gcc-7 warns about a possible sprintf format string overflow with a
temporary buffer that is used to print from another buffer of the same
size:

sound/pci/rme9652/hdspm.c: In function 'snd_hdspm_create_alsa_devices':
sound/pci/rme9652/hdspm.c:2123:17: error: ' MIDIoverMADI' directive writing 13 bytes into a region of size between 1 and 32 [-Werror=format-overflow=]

This extends the temporary buffer to twice the size, and changes
the code to use the safer snprintf() across the entire file.
The longer buffer is still necessary to avoid a format-truncation
warning.

Signed-off-by: Arnd Bergmann <arnd@arndb.de>
Signed-off-by: Takashi Iwai <tiwai@suse.de>
This commit is contained in:
Arnd Bergmann 2017-07-18 13:48:09 +02:00 committed by Takashi Iwai
parent c6e486ffb2
commit 7ad210ace5
1 changed files with 28 additions and 20 deletions

View File

@ -2061,7 +2061,7 @@ static int snd_hdspm_create_midi(struct snd_card *card,
struct hdspm *hdspm, int id) struct hdspm *hdspm, int id)
{ {
int err; int err;
char buf[32]; char buf[64];
hdspm->midi[id].id = id; hdspm->midi[id].id = id;
hdspm->midi[id].hdspm = hdspm; hdspm->midi[id].hdspm = hdspm;
@ -2120,19 +2120,23 @@ static int snd_hdspm_create_midi(struct snd_card *card,
if ((id < 2) || ((2 == id) && ((MADI == hdspm->io_type) || if ((id < 2) || ((2 == id) && ((MADI == hdspm->io_type) ||
(MADIface == hdspm->io_type)))) { (MADIface == hdspm->io_type)))) {
if ((id == 0) && (MADIface == hdspm->io_type)) { if ((id == 0) && (MADIface == hdspm->io_type)) {
sprintf(buf, "%s MIDIoverMADI", card->shortname); snprintf(buf, sizeof(buf), "%s MIDIoverMADI",
card->shortname);
} else if ((id == 2) && (MADI == hdspm->io_type)) { } else if ((id == 2) && (MADI == hdspm->io_type)) {
sprintf(buf, "%s MIDIoverMADI", card->shortname); snprintf(buf, sizeof(buf), "%s MIDIoverMADI",
card->shortname);
} else { } else {
sprintf(buf, "%s MIDI %d", card->shortname, id+1); snprintf(buf, sizeof(buf), "%s MIDI %d",
card->shortname, id+1);
} }
err = snd_rawmidi_new(card, buf, id, 1, 1, err = snd_rawmidi_new(card, buf, id, 1, 1,
&hdspm->midi[id].rmidi); &hdspm->midi[id].rmidi);
if (err < 0) if (err < 0)
return err; return err;
sprintf(hdspm->midi[id].rmidi->name, "%s MIDI %d", snprintf(hdspm->midi[id].rmidi->name,
card->id, id+1); sizeof(hdspm->midi[id].rmidi->name),
"%s MIDI %d", card->id, id+1);
hdspm->midi[id].rmidi->private_data = &hdspm->midi[id]; hdspm->midi[id].rmidi->private_data = &hdspm->midi[id];
snd_rawmidi_set_ops(hdspm->midi[id].rmidi, snd_rawmidi_set_ops(hdspm->midi[id].rmidi,
@ -2148,14 +2152,16 @@ static int snd_hdspm_create_midi(struct snd_card *card,
SNDRV_RAWMIDI_INFO_DUPLEX; SNDRV_RAWMIDI_INFO_DUPLEX;
} else { } else {
/* TCO MTC, read only */ /* TCO MTC, read only */
sprintf(buf, "%s MTC %d", card->shortname, id+1); snprintf(buf, sizeof(buf), "%s MTC %d",
card->shortname, id+1);
err = snd_rawmidi_new(card, buf, id, 1, 1, err = snd_rawmidi_new(card, buf, id, 1, 1,
&hdspm->midi[id].rmidi); &hdspm->midi[id].rmidi);
if (err < 0) if (err < 0)
return err; return err;
sprintf(hdspm->midi[id].rmidi->name, snprintf(hdspm->midi[id].rmidi->name,
"%s MTC %d", card->id, id+1); sizeof(hdspm->midi[id].rmidi->name),
"%s MTC %d", card->id, id+1);
hdspm->midi[id].rmidi->private_data = &hdspm->midi[id]; hdspm->midi[id].rmidi->private_data = &hdspm->midi[id];
snd_rawmidi_set_ops(hdspm->midi[id].rmidi, snd_rawmidi_set_ops(hdspm->midi[id].rmidi,
@ -6869,7 +6875,8 @@ static int snd_hdspm_create(struct snd_card *card,
* when running with multiple cards. * when running with multiple cards.
*/ */
if (NULL == id[hdspm->dev] && hdspm->serial != 0xFFFFFF) { if (NULL == id[hdspm->dev] && hdspm->serial != 0xFFFFFF) {
sprintf(card->id, "HDSPMx%06x", hdspm->serial); snprintf(card->id, sizeof(card->id),
"HDSPMx%06x", hdspm->serial);
snd_card_set_id(card, card->id); snd_card_set_id(card, card->id);
} }
} }
@ -6954,17 +6961,18 @@ static int snd_hdspm_probe(struct pci_dev *pci,
} }
if (hdspm->io_type != MADIface) { if (hdspm->io_type != MADIface) {
sprintf(card->shortname, "%s_%x", snprintf(card->shortname, sizeof(card->shortname), "%s_%x",
hdspm->card_name, hdspm->card_name, hdspm->serial);
hdspm->serial); snprintf(card->longname, sizeof(card->longname),
sprintf(card->longname, "%s S/N 0x%x at 0x%lx, irq %d", "%s S/N 0x%x at 0x%lx, irq %d",
hdspm->card_name, hdspm->card_name, hdspm->serial,
hdspm->serial, hdspm->port, hdspm->irq);
hdspm->port, hdspm->irq);
} else { } else {
sprintf(card->shortname, "%s", hdspm->card_name); snprintf(card->shortname, sizeof(card->shortname), "%s",
sprintf(card->longname, "%s at 0x%lx, irq %d", hdspm->card_name);
hdspm->card_name, hdspm->port, hdspm->irq); snprintf(card->longname, sizeof(card->longname),
"%s at 0x%lx, irq %d",
hdspm->card_name, hdspm->port, hdspm->irq);
} }
err = snd_card_register(card); err = snd_card_register(card);