summaryrefslogtreecommitdiff
path: root/drivers
diff options
context:
space:
mode:
authorVidyakumar Athota <vathota@codeaurora.org>2016-11-29 13:45:42 -0800
committerVidyakumar Athota <vathota@codeaurora.org>2016-11-29 18:18:14 -0800
commita1e1a009233289ca64ff387e7a72bd2f59ae0502 (patch)
treece778185ba2d97295e817804e9a01f8a10a6ef5e /drivers
parenta1ccb4d410b2904ca0591c6ec27a277229b81fc8 (diff)
soc: qcom: fix to avoid invalid memory access
In error scenarios, tx_buf is accessed even after tx_buf memory is freed up. This change is to avoid access to freed up memory. Change-Id: I93a2c5875474094da1de07ddaaad8a709193632f Signed-off-by: Vidyakumar Athota <vathota@codeaurora.org>
Diffstat (limited to 'drivers')
-rw-r--r--drivers/soc/qcom/wcd-dsp-glink.c3
1 files changed, 2 insertions, 1 deletions
diff --git a/drivers/soc/qcom/wcd-dsp-glink.c b/drivers/soc/qcom/wcd-dsp-glink.c
index daa6ed5ed5ea..efd5945ea626 100644
--- a/drivers/soc/qcom/wcd-dsp-glink.c
+++ b/drivers/soc/qcom/wcd-dsp-glink.c
@@ -604,6 +604,7 @@ static void wdsp_glink_tx_buf_work(struct work_struct *work)
mutex_lock(&tx_buf->ch->mutex);
if (ch->channel_state == GLINK_CONNECTED) {
+ mutex_unlock(&tx_buf->ch->mutex);
ret = glink_tx(ch->handle, tx_buf,
cpkt->payload, cpkt->payload_size,
GLINK_TX_REQ_INTENT);
@@ -618,6 +619,7 @@ static void wdsp_glink_tx_buf_work(struct work_struct *work)
kfree(tx_buf);
}
} else {
+ mutex_unlock(&tx_buf->ch->mutex);
dev_err(wpriv->dev, "%s: channel %s is not in connected state\n",
__func__, ch->ch_cfg.name);
/*
@@ -626,7 +628,6 @@ static void wdsp_glink_tx_buf_work(struct work_struct *work)
*/
kfree(tx_buf);
}
- mutex_unlock(&tx_buf->ch->mutex);
}
/*