mirror of
https://github.com/torvalds/linux.git
synced 2026-09-24 06:24:02 +02:00
ALSA: core: Fix potential UAF after asynchronous card release
Usually a sound driver releases the resources assigned to the card via snd_card_free(), and it synchronizes with the whole release procedure. However, when the card is released asynchronously via snd_card_free_when_closed() like USB-audio driver, the situation is slightly different; although the snd_card_disconnect() call at the disconnection guarantees that any newer accesses will be gated, the in-flight tasks might be still accessing to the underlying card->dev device even after the disconnection, which would cause a use-after-free in the end, as reported by fuzzers. For addressing the bug above, this patch takes the refcount of card->dev at initialization of the card object, and releases at its destructor. This assures the availability of the card->dev in its whole lifecycle. Reported-by: Farhad Alemi <farhad.alemi@berkeley.edu> Closes: https://lore.kernel.org/CA+0ovChexj4TrZL_2iG_P0WBEbZc5+73GfB3DkciQi=R8pZOnA@mail.gmail.com Closes: https://lore.kernel.org/CA+0ovCgQUQNN=Z1tJTouiCsDaXR5M-3-SQEGk-cpPXQkM5Xh+w@mail.gmail.com Cc: <stable@vger.kernel.org> Link: https://patch.msgid.link/20260912162150.455144-1-tiwai@suse.de Signed-off-by: Takashi Iwai <tiwai@suse.de>
This commit is contained in:
parent
76a986c980
commit
fd95e68df6
|
|
@ -310,7 +310,7 @@ static int snd_card_init(struct snd_card *card, struct device *parent,
|
|||
kfree(card); /* manually free here, as no destructor called */
|
||||
return err;
|
||||
}
|
||||
card->dev = parent;
|
||||
card->dev = get_device(parent);
|
||||
card->number = idx;
|
||||
WARN_ON(IS_MODULE(CONFIG_SND) && !module);
|
||||
card->module = module;
|
||||
|
|
@ -603,6 +603,7 @@ static int snd_card_do_free(struct snd_card *card)
|
|||
dev_warn(card->dev, "unable to free card info\n");
|
||||
/* Not fatal error */
|
||||
}
|
||||
put_device(card->dev);
|
||||
if (card->release_completion)
|
||||
complete(card->release_completion);
|
||||
if (!managed)
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user