Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 05296048 authored by Jaroslav Kysela's avatar Jaroslav Kysela Committed by Takashi Iwai
Browse files

ALSA: hda_generic: do not read connections for widged with an unknown type



Reading node connections for an unknown widget can confuse HDA codec bus.

Signed-off-by: default avatarJaroslav Kysela <perex@perex.cz>
Signed-off-by: default avatarTakashi Iwai <tiwai@suse.de>
parent 1c20930a
Loading
Loading
Loading
Loading
+11 −7
Original line number Diff line number Diff line
@@ -121,12 +121,18 @@ static int add_new_node(struct hda_codec *codec, struct hda_gspec *spec, hda_nid
	if (node == NULL)
		return -ENOMEM;
	node->nid = nid;
	node->wid_caps = get_wcaps(codec, nid);
	node->type = (node->wid_caps & AC_WCAP_TYPE) >> AC_WCAP_TYPE_SHIFT;
	if (node->type <= AC_WID_BEEP || node->type == AC_WID_VENDOR) {
		nconns = snd_hda_get_connections(codec, nid, conn_list,
						 HDA_MAX_CONNECTIONS);
		if (nconns < 0) {
			kfree(node);
			return nconns;
		}
	} else {
		nconns = 0;
	}
	if (nconns <= ARRAY_SIZE(node->slist))
		node->conn_list = node->slist;
	else {
@@ -140,8 +146,6 @@ static int add_new_node(struct hda_codec *codec, struct hda_gspec *spec, hda_nid
	}
	memcpy(node->conn_list, conn_list, nconns * sizeof(hda_nid_t));
	node->nconns = nconns;
	node->wid_caps = get_wcaps(codec, nid);
	node->type = (node->wid_caps & AC_WCAP_TYPE) >> AC_WCAP_TYPE_SHIFT;

	if (node->type == AC_WID_PIN) {
		node->pin_caps = snd_hda_query_pin_caps(codec, node->nid);