]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
ALSA: hda/conexant: Fix missing error check for jack detection
authorwangdicheng <wangdicheng@kylinos.cn>
Tue, 28 Apr 2026 08:04:50 +0000 (16:04 +0800)
committerTakashi Iwai <tiwai@suse.de>
Wed, 29 Apr 2026 05:49:44 +0000 (07:49 +0200)
In cx_probe(), the return value of snd_hda_jack_detect_enable_callback()
is ignored. This function returns a pointer, and if it fails (e.g., due
to memory allocation failure), it returns an error pointer which must
be checked using IS_ERR().

If the registration fails, the driver continues to probe, but the jack
detection callback will not be registered. This can lead to a kernel
crash later when the driver attempts to handle jack events or accesses
the uninitialized structure.

Check the return value using IS_ERR() and propagate the error via
PTR_ERR() to the probe caller.

Fixes: 7aeb25908648 ("ALSA: hda/conexant: Fix headset auto detect fail in cx8070 and SN6140")
Signed-off-by: wangdicheng <wangdicheng@kylinos.cn>
Link: https://patch.msgid.link/20260428080450.108801-1-wangdich9700@163.com
Signed-off-by: Takashi Iwai <tiwai@suse.de>
sound/hda/codecs/conexant.c

index 3a9717df39b4be4bdb733e3e38bede0485b2355a..e3b6aaabe3a9cc0b0159d48abc7177de168bba3f 100644 (file)
@@ -1175,6 +1175,7 @@ static void add_cx5051_fake_mutes(struct hda_codec *codec)
 static int cx_probe(struct hda_codec *codec, const struct hda_device_id *id)
 {
        struct conexant_spec *spec;
+       struct hda_jack_callback *callback;
        int err;
 
        codec_info(codec, "%s: BIOS auto-probing.\n", codec->core.chip_name);
@@ -1190,7 +1191,12 @@ static int cx_probe(struct hda_codec *codec, const struct hda_device_id *id)
        case 0x14f11f86:
        case 0x14f11f87:
                spec->is_cx11880_sn6140 = true;
-               snd_hda_jack_detect_enable_callback(codec, 0x19, cx_update_headset_mic_vref);
+               callback = snd_hda_jack_detect_enable_callback(codec, 0x19,
+                               cx_update_headset_mic_vref);
+               if (IS_ERR(callback)) {
+                       err = PTR_ERR(callback);
+                       goto error;
+               }
                break;
        }