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: Prasad Kumpatla <nkumpat@codeaurora.org>
diff --git a/asoc/msm-pcm-loopback-v2.c b/asoc/msm-pcm-loopback-v2.c
index af6be3a..4da7848 100644
--- a/asoc/msm-pcm-loopback-v2.c
+++ b/asoc/msm-pcm-loopback-v2.c
@@ -551,13 +551,15 @@
goto exit;
}
mutex_lock(&loopback_session_lock);
- prtd = substream->runtime->private_data;
- if (!prtd) {
- rc = -ENODEV;
- mutex_unlock(&loopback_session_lock);
- goto exit;
+ if (substream->ref_count > 0) {
+ prtd = substream->runtime->private_data;
+ if (!prtd) {
+ rc = -ENODEV;
+ mutex_unlock(&loopback_session_lock);
+ goto exit;
+ }
+ rc = pcm_loopback_set_volume(prtd, volume);
}
- rc = pcm_loopback_set_volume(prtd, volume);
mutex_unlock(&loopback_session_lock);
exit:
return rc;
@@ -583,13 +585,15 @@
goto exit;
}
mutex_lock(&loopback_session_lock);
- prtd = substream->runtime->private_data;
- if (!prtd) {
- rc = -ENODEV;
- mutex_unlock(&loopback_session_lock);
- goto exit;
+ if (substream->ref_count > 0) {
+ prtd = substream->runtime->private_data;
+ if (!prtd) {
+ rc = -ENODEV;
+ mutex_unlock(&loopback_session_lock);
+ goto exit;
+ }
+ ucontrol->value.integer.value[0] = prtd->volume;
}
- ucontrol->value.integer.value[0] = prtd->volume;
mutex_unlock(&loopback_session_lock);
exit:
return rc;
@@ -877,6 +881,12 @@
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) {