Re: [linux-next:master 7970/9778] sound/usb/6fire/chip.c:154 usb6fire_chip_probe() warn: variable dereferenced before check 'card' (see line 123)
Takashi Iwai <[email protected]> Wed, 29 Jul 2026 09:04:52 +0200
| Newsgroups | dev.linux.lists.oe-kbuild,dev.linux.lists.oe-kbuild-all |
|---|---|
| Message-ID | <[email protected]> |
On Wed, 29 Jul 2026 07:43:10 +0200, Dan Carpenter wrote: > > tree: https://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git master > head: 3652b49adac266a3d27cb41cdfdb7d8790fc3633 > commit: a54bf16965f896415c3337bc4fbb40fb11941d99 [7970/9778] ALSA: 6fire: Fix UAF at error handling during probe > config: i386-randconfig-141-20260729 (https://download.01.org/0day-ci/archive/20260729/[email protected]/config) > compiler: clang version 22.1.3 (https://github.com/llvm/llvm-project e9846648fd6183ee6d8cbdb4502213fcf902a211) > smatch: v0.5.0-9187-g5189e3fb > > If you fix the issue in a separate patch/commit (i.e. not just a new version of > the same patch/commit), kindly add following tags > | Reported-by: kernel test robot <[email protected]> > | Reported-by: Dan Carpenter <[email protected]> > | Closes: https://lore.kernel.org/r/[email protected]/ > > smatch warnings: > sound/usb/6fire/chip.c:154 usb6fire_chip_probe() warn: variable dereferenced before check 'card' (see line 123) > > vim +/card +154 sound/usb/6fire/chip.c > > 87f9796a0336ef Bill Pemberton 2012-12-06 70 static int usb6fire_chip_probe(struct usb_interface *intf, > c6d43ba816d1cf Torsten Schenk 2011-01-24 71 const struct usb_device_id *usb_id) > c6d43ba816d1cf Torsten Schenk 2011-01-24 72 { > c6d43ba816d1cf Torsten Schenk 2011-01-24 73 int ret; > c6d43ba816d1cf Torsten Schenk 2011-01-24 74 int i; > c6d43ba816d1cf Torsten Schenk 2011-01-24 75 struct sfire_chip *chip = NULL; > c6d43ba816d1cf Torsten Schenk 2011-01-24 76 struct usb_device *device = interface_to_usbdev(intf); > c6d43ba816d1cf Torsten Schenk 2011-01-24 77 int regidx = -1; /* index in module parameter array */ > c6d43ba816d1cf Torsten Schenk 2011-01-24 78 struct snd_card *card = NULL; > c6d43ba816d1cf Torsten Schenk 2011-01-24 79 > c6d43ba816d1cf Torsten Schenk 2011-01-24 80 /* look if we already serve this card and return if so */ > f3c80e76a0e94c Takashi Iwai 2026-04-14 81 guard(mutex)(®ister_mutex); > c6d43ba816d1cf Torsten Schenk 2011-01-24 82 for (i = 0; i < SNDRV_CARDS; i++) { > 4d5de85b6a9961 Takashi Iwai 2026-04-14 83 if (chips[i] && chips[i]->dev == device) { > c6d43ba816d1cf Torsten Schenk 2011-01-24 84 chips[i]->intf_count++; > c6d43ba816d1cf Torsten Schenk 2011-01-24 85 usb_set_intfdata(intf, chips[i]); > c6d43ba816d1cf Torsten Schenk 2011-01-24 86 return 0; > 4d5de85b6a9961 Takashi Iwai 2026-04-14 87 } else if (!chips[i] && regidx < 0) > c6d43ba816d1cf Torsten Schenk 2011-01-24 88 regidx = i; > c6d43ba816d1cf Torsten Schenk 2011-01-24 89 } > c6d43ba816d1cf Torsten Schenk 2011-01-24 90 if (regidx < 0) { > e3b3757b92a4df Takashi Iwai 2014-02-26 91 dev_err(&intf->dev, "too many cards registered.\n"); > c6d43ba816d1cf Torsten Schenk 2011-01-24 92 return -ENODEV; > c6d43ba816d1cf Torsten Schenk 2011-01-24 93 } > c6d43ba816d1cf Torsten Schenk 2011-01-24 94 > c6d43ba816d1cf Torsten Schenk 2011-01-24 95 /* check, if firmware is present on device, upload it if not */ > c6d43ba816d1cf Torsten Schenk 2011-01-24 96 ret = usb6fire_fw_init(intf); > c6d43ba816d1cf Torsten Schenk 2011-01-24 97 if (ret < 0) > c6d43ba816d1cf Torsten Schenk 2011-01-24 98 return ret; > c6d43ba816d1cf Torsten Schenk 2011-01-24 99 else if (ret == FW_NOT_READY) /* firmware update performed */ > c6d43ba816d1cf Torsten Schenk 2011-01-24 100 return 0; > c6d43ba816d1cf Torsten Schenk 2011-01-24 101 > c6d43ba816d1cf Torsten Schenk 2011-01-24 102 /* if we are here, card can be registered in alsa. */ > c6d43ba816d1cf Torsten Schenk 2011-01-24 103 if (usb_set_interface(device, 0, 0) != 0) { > e3b3757b92a4df Takashi Iwai 2014-02-26 104 dev_err(&intf->dev, "can't set first interface.\n"); > c6d43ba816d1cf Torsten Schenk 2011-01-24 105 return -EIO; > c6d43ba816d1cf Torsten Schenk 2011-01-24 106 } > 874b8d422e26e2 Takashi Iwai 2014-01-29 107 ret = snd_card_new(&intf->dev, index[regidx], id[regidx], > 874b8d422e26e2 Takashi Iwai 2014-01-29 108 THIS_MODULE, sizeof(struct sfire_chip), &card); > c6d43ba816d1cf Torsten Schenk 2011-01-24 109 if (ret < 0) { > e3b3757b92a4df Takashi Iwai 2014-02-26 110 dev_err(&intf->dev, "cannot create alsa card.\n"); > c6d43ba816d1cf Torsten Schenk 2011-01-24 111 return ret; > c6d43ba816d1cf Torsten Schenk 2011-01-24 112 } > 19a28b8c7f9f63 Takashi Iwai 2025-07-10 113 strscpy(card->driver, "6FireUSB"); > 19a28b8c7f9f63 Takashi Iwai 2025-07-10 114 strscpy(card->shortname, "TerraTec DMX6FireUSB"); > c6d43ba816d1cf Torsten Schenk 2011-01-24 115 sprintf(card->longname, "%s at %d:%d", card->shortname, > c6d43ba816d1cf Torsten Schenk 2011-01-24 116 device->bus->busnum, device->devnum); > c6d43ba816d1cf Torsten Schenk 2011-01-24 117 > c6d43ba816d1cf Torsten Schenk 2011-01-24 118 chip = card->private_data; > c6d43ba816d1cf Torsten Schenk 2011-01-24 119 chip->dev = device; > c6d43ba816d1cf Torsten Schenk 2011-01-24 120 chip->regidx = regidx; > c6d43ba816d1cf Torsten Schenk 2011-01-24 121 chip->intf_count = 1; > c6d43ba816d1cf Torsten Schenk 2011-01-24 122 chip->card = card; > a0810c3d6dd2d2 Takashi Iwai 2024-11-13 @123 card->private_free = usb6fire_card_free; > c6d43ba816d1cf Torsten Schenk 2011-01-24 124 > c6d43ba816d1cf Torsten Schenk 2011-01-24 125 ret = usb6fire_comm_init(chip); > f804fff1361c9d Markus Elfring 2017-09-06 126 if (ret < 0) > f804fff1361c9d Markus Elfring 2017-09-06 127 goto destroy_chip; > c6d43ba816d1cf Torsten Schenk 2011-01-24 128 > c6d43ba816d1cf Torsten Schenk 2011-01-24 129 ret = usb6fire_midi_init(chip); > f804fff1361c9d Markus Elfring 2017-09-06 130 if (ret < 0) > f804fff1361c9d Markus Elfring 2017-09-06 131 goto destroy_chip; > c6d43ba816d1cf Torsten Schenk 2011-01-24 132 > c6d43ba816d1cf Torsten Schenk 2011-01-24 133 ret = usb6fire_pcm_init(chip); > f804fff1361c9d Markus Elfring 2017-09-06 134 if (ret < 0) > f804fff1361c9d Markus Elfring 2017-09-06 135 goto destroy_chip; > c6d43ba816d1cf Torsten Schenk 2011-01-24 136 > c6d43ba816d1cf Torsten Schenk 2011-01-24 137 ret = usb6fire_control_init(chip); > f804fff1361c9d Markus Elfring 2017-09-06 138 if (ret < 0) > f804fff1361c9d Markus Elfring 2017-09-06 139 goto destroy_chip; > c6d43ba816d1cf Torsten Schenk 2011-01-24 140 > c6d43ba816d1cf Torsten Schenk 2011-01-24 141 ret = snd_card_register(card); > c6d43ba816d1cf Torsten Schenk 2011-01-24 142 if (ret < 0) { > e3b3757b92a4df Takashi Iwai 2014-02-26 143 dev_err(&intf->dev, "cannot register card."); > f804fff1361c9d Markus Elfring 2017-09-06 144 goto destroy_chip; > c6d43ba816d1cf Torsten Schenk 2011-01-24 145 } > 4d5de85b6a9961 Takashi Iwai 2026-04-14 146 > c6d43ba816d1cf Torsten Schenk 2011-01-24 147 usb_set_intfdata(intf, chip); > 4d5de85b6a9961 Takashi Iwai 2026-04-14 148 chips[regidx] = chip; > 4d5de85b6a9961 Takashi Iwai 2026-04-14 149 > c6d43ba816d1cf Torsten Schenk 2011-01-24 150 return 0; > f804fff1361c9d Markus Elfring 2017-09-06 151 > f804fff1361c9d Markus Elfring 2017-09-06 152 destroy_chip: > a54bf16965f896 Takashi Iwai 2026-07-26 153 chip->shutdown = true; > a54bf16965f896 Takashi Iwai 2026-07-26 @154 if (card) > > You could delete this check if you want. Yes, the NULL check is superfluous and can be dropped. > a54bf16965f896 Takashi Iwai 2026-07-26 155 snd_card_disconnect(card); > > Setting chip->shutdown = true means that it's pointless to > call snd_card_disconnect(). It's a no-op. snd_card_disconnect() > has a "card->shutdown = 1;" No, the above is chip->shutdown and it's different from card->shutdown. thanks, Takashi