From 3daac9507a410b4c3107819020edd96b78b76efd Mon Sep 17 00:00:00 2001 From: Deepali Jindal Date: Tue, 20 Jun 2023 21:51:05 +0530 Subject: [PATCH] asoc: lpass-cdc: Add check for array bound overflow In lpass_cdc_wsa_macro_config_compander function, add check for wsa_sys_gain array's index to make sure it won't go out of bound. Change-Id: I9d8512726de959e7a0d9e875e966140d70412e25 Signed-off-by: Deepali Jindal --- asoc/codecs/lpass-cdc/lpass-cdc-wsa-macro.c | 9 ++++++++- asoc/codecs/lpass-cdc/lpass-cdc-wsa2-macro.c | 9 ++++++++- 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/asoc/codecs/lpass-cdc/lpass-cdc-wsa-macro.c b/asoc/codecs/lpass-cdc/lpass-cdc-wsa-macro.c index 599c185c54..881d191d01 100644 --- a/asoc/codecs/lpass-cdc/lpass-cdc-wsa-macro.c +++ b/asoc/codecs/lpass-cdc/lpass-cdc-wsa-macro.c @@ -1374,6 +1374,7 @@ static int lpass_cdc_wsa_macro_config_compander(struct snd_soc_component *compon struct lpass_cdc_wsa_macro_priv *wsa_priv = NULL; struct lpass_cdc_comp_setting *comp_settings = NULL; u16 mode = 0; + u16 index = 0; int sys_gain, bat_cfg, sys_gain_int, upper_gain, lower_gain; if (!lpass_cdc_wsa_macro_get_data(component, &wsa_dev, &wsa_priv, __func__)) @@ -1404,7 +1405,13 @@ static int lpass_cdc_wsa_macro_config_compander(struct snd_soc_component *compon /* If System has battery configuration */ if (wsa_priv->wsa_bat_cfg[comp]) { - sys_gain = wsa_priv->wsa_sys_gain[comp * 2 + wsa_priv->wsa_spkrrecv]; + index = (comp * 2) + wsa_priv->wsa_spkrrecv; + if (index >= (2 * (LPASS_CDC_WSA_MACRO_RX1 + 1))) { + dev_err(component->dev, "%s: Invalid index: %d\n", + __func__, index); + return -EINVAL; + } + sys_gain = wsa_priv->wsa_sys_gain[index]; bat_cfg = wsa_priv->wsa_bat_cfg[comp]; /* Convert enum to value and * multiply all values by 10 to avoid float diff --git a/asoc/codecs/lpass-cdc/lpass-cdc-wsa2-macro.c b/asoc/codecs/lpass-cdc/lpass-cdc-wsa2-macro.c index c81051bf58..6a5a660aaa 100644 --- a/asoc/codecs/lpass-cdc/lpass-cdc-wsa2-macro.c +++ b/asoc/codecs/lpass-cdc/lpass-cdc-wsa2-macro.c @@ -1379,6 +1379,7 @@ static int lpass_cdc_wsa2_macro_config_compander(struct snd_soc_component *compo struct lpass_cdc_wsa2_macro_priv *wsa2_priv = NULL; struct lpass_cdc_comp_setting *comp_settings = NULL; u16 mode = 0; + u16 index = 0; int sys_gain, bat_cfg, sys_gain_int, upper_gain, lower_gain; if (!lpass_cdc_wsa2_macro_get_data(component, &wsa2_dev, &wsa2_priv, __func__)) @@ -1409,7 +1410,13 @@ static int lpass_cdc_wsa2_macro_config_compander(struct snd_soc_component *compo /* If System has battery configuration */ if (wsa2_priv->wsa2_bat_cfg[comp]) { - sys_gain = wsa2_priv->wsa2_sys_gain[comp * 2 + wsa2_priv->wsa2_spkrrecv]; + index = (comp * 2) + wsa2_priv->wsa2_spkrrecv; + if (index >= (2 * (LPASS_CDC_WSA2_MACRO_RX1 + 1))) { + dev_err(component->dev, "%s: Invalid index: %d\n", + __func__, index); + return -EINVAL; + } + sys_gain = wsa2_priv->wsa2_sys_gain[index]; bat_cfg = wsa2_priv->wsa2_bat_cfg[comp]; /* Convert enum to value and * multiply all values by 10 to avoid float