]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
ALSA: hda: cs35l41: Put ACPI device on missing physical node
authorShuhao Fu <sfual@cse.ust.hk>
Tue, 28 Apr 2026 08:12:38 +0000 (16:12 +0800)
committerTakashi Iwai <tiwai@suse.de>
Thu, 7 May 2026 14:31:25 +0000 (16:31 +0200)
acpi_dev_get_first_match_dev() returns a refcounted ACPI device and
callers must balance it with acpi_dev_put().

cs35l41_hda_read_acpi() stores the returned ACPI device in
cs35l41->dacpi. That reference is normally released by the later
probe cleanup or the remove path, but the NULL-check on
physdev exits before either of those paths can run.

Drop the lookup reference before returning -ENODEV.

Fixes: c34b04cc6178 ("ALSA: hda: cs35l41: Fix NULL pointer dereference in cs35l41_hda_read_acpi()")
Signed-off-by: Shuhao Fu <sfual@cse.ust.hk>
Tested-by: Simon Trimmer <simont@opensource.cirrus.com>
Signed-off-by: Takashi Iwai <tiwai@suse.de>
Link: https://patch.msgid.link/20260428081238.GA1659932@chcpu16
sound/hda/codecs/side-codecs/cs35l41_hda.c

index b64890006bb70196334679a657ca960bdc8a892b..acfccc848f82d82b2e0e4985e839f9a3a9520bde 100644 (file)
@@ -1896,8 +1896,10 @@ static int cs35l41_hda_read_acpi(struct cs35l41_hda *cs35l41, const char *hid, i
 
        cs35l41->dacpi = adev;
        physdev = get_device(acpi_get_first_physical_node(adev));
-       if (!physdev)
+       if (!physdev) {
+               acpi_dev_put(adev);
                return -ENODEV;
+       }
 
        sub = acpi_get_subsystem_id(ACPI_HANDLE(physdev));
        if (IS_ERR(sub))