msm: asm: validate ADSP data before access
Validate buffer index obtained from ADSP token before using it. CRs-Fixed: 2372302 Change-Id: I5c3b1634bd08b516844638dd67f726a882edfc17 Signed-off-by: Vignesh Kulothungan <vigneshk@codeaurora.org>
This commit is contained in:
parent
c2c52e8d2b
commit
877ffd6d9d
1 changed files with 22 additions and 0 deletions
|
@ -1962,6 +1962,7 @@ static int32_t q6asm_callback(struct apr_client_data *data, void *priv)
|
||||||
data->dest_port);
|
data->dest_port);
|
||||||
if ((data->opcode != ASM_DATA_EVENT_RENDERED_EOS) &&
|
if ((data->opcode != ASM_DATA_EVENT_RENDERED_EOS) &&
|
||||||
(data->opcode != ASM_DATA_EVENT_EOS) &&
|
(data->opcode != ASM_DATA_EVENT_EOS) &&
|
||||||
|
(data->opcode != ASM_SESSION_EVENTX_OVERFLOW) &&
|
||||||
(data->opcode != ASM_SESSION_EVENT_RX_UNDERFLOW)) {
|
(data->opcode != ASM_SESSION_EVENT_RX_UNDERFLOW)) {
|
||||||
if (payload == NULL) {
|
if (payload == NULL) {
|
||||||
pr_err("%s: payload is null\n", __func__);
|
pr_err("%s: payload is null\n", __func__);
|
||||||
|
@ -2177,6 +2178,17 @@ static int32_t q6asm_callback(struct apr_client_data *data, void *priv)
|
||||||
}
|
}
|
||||||
spin_lock_irqsave(&port->dsp_lock, dsp_flags);
|
spin_lock_irqsave(&port->dsp_lock, dsp_flags);
|
||||||
buf_index = asm_token._token.buf_index;
|
buf_index = asm_token._token.buf_index;
|
||||||
|
if (buf_index < 0 ||
|
||||||
|
buf_index >= port->max_buf_cnt) {
|
||||||
|
pr_debug("%s: Invalid buffer index %u\n",
|
||||||
|
__func__, buf_index);
|
||||||
|
spin_unlock_irqrestore(&port->dsp_lock,
|
||||||
|
dsp_flags);
|
||||||
|
spin_unlock_irqrestore(
|
||||||
|
&(session[session_id].session_lock),
|
||||||
|
flags);
|
||||||
|
return -EINVAL;
|
||||||
|
}
|
||||||
if (data->payload_size >= 2 * sizeof(uint32_t) &&
|
if (data->payload_size >= 2 * sizeof(uint32_t) &&
|
||||||
(lower_32_bits(port->buf[buf_index].phys) !=
|
(lower_32_bits(port->buf[buf_index].phys) !=
|
||||||
payload[0] ||
|
payload[0] ||
|
||||||
|
@ -2287,6 +2299,16 @@ static int32_t q6asm_callback(struct apr_client_data *data, void *priv)
|
||||||
}
|
}
|
||||||
spin_lock_irqsave(&port->dsp_lock, dsp_flags);
|
spin_lock_irqsave(&port->dsp_lock, dsp_flags);
|
||||||
buf_index = asm_token._token.buf_index;
|
buf_index = asm_token._token.buf_index;
|
||||||
|
if (buf_index < 0 || buf_index >= port->max_buf_cnt) {
|
||||||
|
pr_debug("%s: Invalid buffer index %u\n",
|
||||||
|
__func__, buf_index);
|
||||||
|
spin_unlock_irqrestore(&port->dsp_lock,
|
||||||
|
dsp_flags);
|
||||||
|
spin_unlock_irqrestore(
|
||||||
|
&(session[session_id].session_lock),
|
||||||
|
flags);
|
||||||
|
return -EINVAL;
|
||||||
|
}
|
||||||
port->buf[buf_index].used = 0;
|
port->buf[buf_index].used = 0;
|
||||||
if (lower_32_bits(port->buf[buf_index].phys) !=
|
if (lower_32_bits(port->buf[buf_index].phys) !=
|
||||||
payload[READDONE_IDX_BUFADD_LSW] ||
|
payload[READDONE_IDX_BUFADD_LSW] ||
|
||||||
|
|
Loading…
Add table
Reference in a new issue