Patch "ALSA: hda: Do not unset preset when cleaning up codec" has been added to the 5.15-stable tree

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



This is a note to let you know that I've just added the patch titled

    ALSA: hda: Do not unset preset when cleaning up codec

to the 5.15-stable tree which can be found at:
    http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary

The filename of the patch is:
     alsa-hda-do-not-unset-preset-when-cleaning-up-codec.patch
and it can be found in the queue-5.15 subdirectory.

If you, or anyone else, feels it should not be added to the stable tree,
please let <stable@xxxxxxxxxxxxxxx> know about it.



commit b40fde804fdc1eee97ec92fa28e1d7dbeb3b288a
Author: Cezary Rojewski <cezary.rojewski@xxxxxxxxx>
Date:   Thu Jan 19 15:32:35 2023 +0100

    ALSA: hda: Do not unset preset when cleaning up codec
    
    [ Upstream commit 87978e6ad45a16835cc58234451111091be3c59a ]
    
    Several functions that take part in codec's initialization and removal
    are re-used by ASoC codec drivers implementations. Drivers mimic the
    behavior of hda_codec_driver_probe/remove() found in
    sound/pci/hda/hda_bind.c with their component->probe/remove() instead.
    
    One of the reasons for that is the expectation of
    snd_hda_codec_device_new() to receive a valid pointer to an instance of
    struct snd_card. This expectation can be met only once sound card
    components probing commences.
    
    As ASoC sound card may be unbound without codec device being actually
    removed from the system, unsetting ->preset in
    snd_hda_codec_cleanup_for_unbind() interferes with module unload -> load
    scenario causing null-ptr-deref. Preset is assigned only once, during
    device/driver matching whereas ASoC codec driver's module reloading may
    occur several times throughout the lifetime of an audio stack.
    
    Suggested-by: Takashi Iwai <tiwai@xxxxxxxx>
    Signed-off-by: Cezary Rojewski <cezary.rojewski@xxxxxxxxx>
    Link: https://lore.kernel.org/r/20230119143235.1159814-1-cezary.rojewski@xxxxxxxxx
    Signed-off-by: Takashi Iwai <tiwai@xxxxxxx>
    Signed-off-by: Sasha Levin <sashal@xxxxxxxxxx>

diff --git a/sound/pci/hda/hda_bind.c b/sound/pci/hda/hda_bind.c
index 7af2515735957..8e35009ec25cb 100644
--- a/sound/pci/hda/hda_bind.c
+++ b/sound/pci/hda/hda_bind.c
@@ -144,6 +144,7 @@ static int hda_codec_driver_probe(struct device *dev)
 
  error:
 	snd_hda_codec_cleanup_for_unbind(codec);
+	codec->preset = NULL;
 	return err;
 }
 
@@ -166,6 +167,7 @@ static int hda_codec_driver_remove(struct device *dev)
 	if (codec->patch_ops.free)
 		codec->patch_ops.free(codec);
 	snd_hda_codec_cleanup_for_unbind(codec);
+	codec->preset = NULL;
 	module_put(dev->driver->owner);
 	return 0;
 }
diff --git a/sound/pci/hda/hda_codec.c b/sound/pci/hda/hda_codec.c
index f552785d301e0..19be60bb57810 100644
--- a/sound/pci/hda/hda_codec.c
+++ b/sound/pci/hda/hda_codec.c
@@ -791,7 +791,6 @@ void snd_hda_codec_cleanup_for_unbind(struct hda_codec *codec)
 	snd_array_free(&codec->cvt_setups);
 	snd_array_free(&codec->spdif_out);
 	snd_array_free(&codec->verbs);
-	codec->preset = NULL;
 	codec->follower_dig_outs = NULL;
 	codec->spdif_status_reset = 0;
 	snd_array_free(&codec->mixers);



[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux