ALSA: pcxhr: fix string overflow warnings
authorArnd Bergmann <arnd@arndb.de>
Tue, 18 Jul 2017 11:48:10 +0000 (13:48 +0200)
committerTakashi Iwai <tiwai@suse.de>
Tue, 18 Jul 2017 15:55:11 +0000 (17:55 +0200)
With gcc-7, we get a warning about a possible string overflow:

sound/pci/pcxhr/pcxhr.c: In function 'pcxhr_probe':
sound/pci/pcxhr/pcxhr.c:1647:28: error: ' [PCM #' directive writing 7 bytes into a region of size between 1 and 32 [-Werror=format-overflow=]

The shortname can simply be removed, and the longname can
be changed into a shorter "name" string that is used in three
places. Making it a little shorter (40 bytes) avoids the risk of
overflowing completely, but I also use snprintf() here for
extra clarity.

Signed-off-by: Arnd Bergmann <arnd@arndb.de>
Signed-off-by: Takashi Iwai <tiwai@suse.de>
sound/pci/pcxhr/pcxhr.c
sound/pci/pcxhr/pcxhr.h

index bb7eee9d0c2bbb695159641368843620f9aa32c4..fa919f52e225a7a77418c8301f2d75b1fda41aff 100644 (file)
@@ -1165,7 +1165,7 @@ int pcxhr_create_pcm(struct snd_pcxhr *chip)
        struct snd_pcm *pcm;
        char name[32];
 
-       sprintf(name, "pcxhr %d", chip->chip_idx);
+       snprintf(name, sizeof(name), "pcxhr %d", chip->chip_idx);
        if ((err = snd_pcm_new(chip->card, name, 0,
                               chip->nb_streams_play,
                               chip->nb_streams_capt, &pcm)) < 0) {
@@ -1252,7 +1252,7 @@ static void pcxhr_proc_info(struct snd_info_entry *entry,
        struct snd_pcxhr *chip = entry->private_data;
        struct pcxhr_mgr *mgr = chip->mgr;
 
-       snd_iprintf(buffer, "\n%s\n", mgr->longname);
+       snd_iprintf(buffer, "\n%s\n", mgr->name);
 
        /* stats available when embedded DSP is running */
        if (mgr->dsp_loaded & (1 << PCXHR_FIRMWARE_DSP_MAIN_INDEX)) {
@@ -1339,7 +1339,7 @@ static void pcxhr_proc_sync(struct snd_info_entry *entry,
                max_clock = PCXHR_CLOCK_TYPE_MAX;
        }
 
-       snd_iprintf(buffer, "\n%s\n", mgr->longname);
+       snd_iprintf(buffer, "\n%s\n", mgr->name);
        snd_iprintf(buffer, "Current Sample Clock\t: %s\n",
                    texts[mgr->cur_clock_type]);
        snd_iprintf(buffer, "Current Sample Rate\t= %d\n",
@@ -1597,10 +1597,9 @@ static int pcxhr_probe(struct pci_dev *pci,
        }
        mgr->irq = pci->irq;
 
-       sprintf(mgr->shortname, "Digigram %s", card_name);
-       sprintf(mgr->longname, "%s at 0x%lx & 0x%lx, 0x%lx irq %i",
-               mgr->shortname,
-               mgr->port[0], mgr->port[1], mgr->port[2], mgr->irq);
+       snprintf(mgr->name, sizeof(mgr->name),
+                "Digigram at 0x%lx & 0x%lx, 0x%lx irq %i",
+                mgr->port[0], mgr->port[1], mgr->port[2], mgr->irq);
 
        /* ISR lock  */
        mutex_init(&mgr->lock);
@@ -1644,8 +1643,10 @@ static int pcxhr_probe(struct pci_dev *pci,
                }
 
                strcpy(card->driver, DRIVER_NAME);
-               sprintf(card->shortname, "%s [PCM #%d]", mgr->shortname, i);
-               sprintf(card->longname, "%s [PCM #%d]", mgr->longname, i);
+               snprintf(card->shortname, sizeof(card->shortname),
+                        "Digigram [PCM #%d]", i);
+               snprintf(card->longname, sizeof(card->longname),
+                        "%s [PCM #%d]", mgr->name, i);
 
                if ((err = pcxhr_create(mgr, card, i)) < 0) {
                        snd_card_free(card);
index 9e39e509a3ef9375db81b853b8e61983a4de9c9c..d799cbd37301be7b6ff5c22b0d4b1ed0485b21ed 100644 (file)
@@ -75,8 +75,7 @@ struct pcxhr_mgr {
        unsigned long port[3];
 
        /* share the name */
-       char shortname[32];             /* short name of this soundcard */
-       char longname[96];              /* name of this soundcard */
+       char name[40];                  /* name of this soundcard */
 
        struct pcxhr_rmh *prmh;