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

Commit 348bc678 authored by Prasad Kumpatla's avatar Prasad Kumpatla Committed by Gerrit - the friendly Code Review server
Browse files

asoc: Add check for substream ref_count before access the substream.



Add check for substream ref count before access the substream.

Change-Id: Iccb6226519e8fddf624f82160a0d8d22641944db
Signed-off-by: default avatarPrasad Kumpatla <nkumpat@codeaurora.org>
parent 17de17b7
Loading
Loading
Loading
Loading
+22 −12
Original line number Diff line number Diff line
@@ -551,6 +551,7 @@ static int msm_pcm_volume_ctl_put(struct snd_kcontrol *kcontrol,
		goto exit;
	}
	mutex_lock(&loopback_session_lock);
	if (substream->ref_count > 0) {
		prtd = substream->runtime->private_data;
		if (!prtd) {
			rc = -ENODEV;
@@ -558,6 +559,7 @@ static int msm_pcm_volume_ctl_put(struct snd_kcontrol *kcontrol,
			goto exit;
		}
		rc = pcm_loopback_set_volume(prtd, volume);
	}
	mutex_unlock(&loopback_session_lock);
exit:
	return rc;
@@ -583,6 +585,7 @@ static int msm_pcm_volume_ctl_get(struct snd_kcontrol *kcontrol,
		goto exit;
	}
	mutex_lock(&loopback_session_lock);
	if (substream->ref_count > 0) {
		prtd = substream->runtime->private_data;
		if (!prtd) {
			rc = -ENODEV;
@@ -590,6 +593,7 @@ static int msm_pcm_volume_ctl_get(struct snd_kcontrol *kcontrol,
			goto exit;
		}
		ucontrol->value.integer.value[0] = prtd->volume;
	}
	mutex_unlock(&loopback_session_lock);
exit:
	return rc;
@@ -877,6 +881,12 @@ static int msm_pcm_channel_mixer_cfg_ctl_put(struct snd_kcontrol *kcontrol,
			chmixer_pspd);

	mutex_lock(&loopback_session_lock);
	if (substream->ref_count <= 0) {
		pr_err_ratelimited("%s: substream ref_count:%d invalid\n",
				__func__, substream->ref_count);
		mutex_unlock(&loopback_session_lock);
		return -EINVAL;
	}
	if (chmixer_pspd->enable && substream->runtime) {
		prtd = substream->runtime->private_data;
		if (!prtd) {
+11 −7
Original line number Diff line number Diff line
@@ -754,9 +754,11 @@ static int msm_pcm_volume_ctl_get(struct snd_kcontrol *kcontrol,
		return -ENODEV;
	}
	mutex_lock(&pdata->lock);
	if (substream->ref_count > 0) {
		prtd = substream->runtime->private_data;
		if (prtd)
			ucontrol->value.integer.value[0] = prtd->volume;
	}
	mutex_unlock(&pdata->lock);
	return 0;
}
@@ -799,11 +801,13 @@ static int msm_pcm_volume_ctl_put(struct snd_kcontrol *kcontrol,
	}

	mutex_lock(&pdata->lock);
	if (substream->ref_count > 0) {
		prtd = substream->runtime->private_data;
		if (prtd) {
			rc = msm_pcm_set_volume(prtd, volume);
			prtd->volume = volume;
		}
	}
	mutex_unlock(&pdata->lock);
	return rc;
}
+47 −16
Original line number Diff line number Diff line
@@ -1325,7 +1325,12 @@ static int msm_pcm_adsp_stream_cmd_put(struct snd_kcontrol *kcontrol,
		ret = -EINVAL;
		goto done;
	}

	if (substream->ref_count <= 0) {
		pr_err_ratelimited("%s substream ref_count:%d invalid\n",
				__func__, substream->ref_count);
		ret = -EINVAL;
		goto done;
	}
	prtd = substream->runtime->private_data;
	if (prtd == NULL) {
		pr_err("%s prtd is null.\n", __func__);
@@ -1549,9 +1554,11 @@ static int msm_pcm_volume_ctl_get(struct snd_kcontrol *kcontrol,
	}

	mutex_lock(&pdata->lock);
	if (substream->ref_count > 0) {
		prtd = substream->runtime->private_data;
		if (prtd)
			ucontrol->value.integer.value[0] = prtd->volume;
	}
	mutex_unlock(&pdata->lock);
	return 0;
}
@@ -1595,11 +1602,13 @@ static int msm_pcm_volume_ctl_put(struct snd_kcontrol *kcontrol,
	}

	mutex_lock(&pdata->lock);
	if (substream->ref_count > 0) {
		prtd = substream->runtime->private_data;
		if (prtd) {
			rc = msm_pcm_set_volume(prtd, volume);
			prtd->volume = volume;
		}
	}
	mutex_unlock(&pdata->lock);
	return rc;
}
@@ -1659,9 +1668,11 @@ static int msm_pcm_compress_ctl_get(struct snd_kcontrol *kcontrol,
		return 0;
	}
	mutex_lock(&pdata->lock);
	if (substream->ref_count > 0) {
		prtd = substream->runtime->private_data;
		if (prtd)
			ucontrol->value.integer.value[0] = prtd->compress_enable;
	}
	mutex_unlock(&pdata->lock);
	return 0;
}
@@ -1691,12 +1702,14 @@ static int msm_pcm_compress_ctl_put(struct snd_kcontrol *kcontrol,
		return 0;
	}
	mutex_lock(&pdata->lock);
	if (substream->ref_count > 0) {
		prtd = substream->runtime->private_data;
		if (prtd) {
			pr_debug("%s: setting compress flag to 0x%x\n",
			__func__, compress);
			prtd->compress_enable = compress;
		}
	}
	mutex_unlock(&pdata->lock);
	return rc;
}
@@ -1805,6 +1818,12 @@ static int msm_pcm_chmap_ctl_put(struct snd_kcontrol *kcontrol,
		return 0;

	mutex_lock(&pdata->lock);
	if (substream->ref_count <= 0) {
		pr_err_ratelimited("%s: substream ref_count:%d invalid\n",
				__func__, substream->ref_count);
		mutex_unlock(&pdata->lock);
		return -EINVAL;
	}
	prtd = substream->runtime ? substream->runtime->private_data : NULL;
	if (prtd) {
		prtd->set_channel_map = true;
@@ -1872,6 +1891,12 @@ static int msm_pcm_chmap_ctl_get(struct snd_kcontrol *kcontrol,
		return 0; /* no channels set */

	mutex_lock(&pdata->lock);
	if (substream->ref_count <= 0) {
		pr_err_ratelimited("%s: substream ref_count:%d invalid\n",
				__func__, substream->ref_count);
		mutex_unlock(&pdata->lock);
		return -EINVAL;
	}
	prtd = substream->runtime ? substream->runtime->private_data : NULL;

	if (prtd && prtd->set_channel_map == true) {
@@ -2154,6 +2179,12 @@ static int msm_pcm_channel_mixer_cfg_ctl_put(struct snd_kcontrol *kcontrol,
	}

	mutex_lock(&pdata->lock);
	if (substream->ref_count <= 0) {
		pr_err_ratelimited("%s: substream ref_count:%d invalid\n",
				__func__, substream->ref_count);
		mutex_unlock(&pdata->lock);
		return -EINVAL;
	}
	prtd = substream->runtime ? substream->runtime->private_data : NULL;
	if (chmixer_pspd->enable && prtd) {
		if (session_type == SESSION_TYPE_RX &&