Browse Source

ASoC: wcd934x: check sound card state to avoid pointer dereference

When codec probe is not correctly completed and ADSP SSR happens
before sound card is registered, calling SSR callback may result
into NULL pointer dereference and kernel panic happens.
Check sound card state when calling device_down and post_reset to
avoid NULL pointer dereference.

Change-Id: I35fd84af51edf45db6fd451dc68dbcaaed11fee7
Signed-off-by: Meng Wang <[email protected]>
Meng Wang 6 years ago
parent
commit
567bcd3b7a
1 changed files with 11 additions and 0 deletions
  1. 11 0
      asoc/codecs/wcd934x/wcd934x.c

+ 11 - 0
asoc/codecs/wcd934x/wcd934x.c

@@ -9977,6 +9977,12 @@ static int tavil_device_down(struct wcd9xxx *wcd9xxx)
 	int ret;
 
 	codec = (struct snd_soc_codec *)(wcd9xxx->ssr_priv);
+	if (!codec->component.card) {
+		dev_err(codec->dev, "%s: sound card is not enumerated.\n",
+			__func__);
+		return -EINVAL;
+	}
+
 	priv = snd_soc_codec_get_drvdata(codec);
 	for (count = 0; count < NUM_CODEC_DAIS; count++)
 		priv->dai[count].bus_down_in_recovery = true;
@@ -10027,6 +10033,11 @@ static int tavil_post_reset_cb(struct wcd9xxx *wcd9xxx)
 	struct wcd_mbhc *mbhc;
 
 	codec = (struct snd_soc_codec *)(wcd9xxx->ssr_priv);
+	if (!codec->component.card) {
+		dev_err(codec->dev, "%s: sound card is not enumerated.\n",
+			__func__);
+		return -EINVAL;
+	}
 	tavil = snd_soc_codec_get_drvdata(codec);
 	control = dev_get_drvdata(codec->dev->parent);