Skip to content

Commit

Permalink
staging: greybus: audio: fix uninitialized value issue
Browse files Browse the repository at this point in the history
commit 1dffeb8b8b4c261c45416d53c75ea51e6ece1770 upstream.

The current implementation for gbcodec_mixer_dapm_ctl_put() uses
uninitialized gbvalue for comparison with updated value. This was found
using static analysis with coverity.

Uninitialized scalar variable (UNINIT)
11. uninit_use: Using uninitialized value
gbvalue.value.integer_value[0].
460        if (gbvalue.value.integer_value[0] != val) {

This patch fixes the issue with fetching the gbvalue before using it for
    comparision.

Fixes: 6339d23 ("greybus: audio: Add topology parser for GB codec")
Reported-by: Colin Ian King <[email protected]>
Signed-off-by: Vaibhav Agarwal <[email protected]>
Cc: stable <[email protected]>
Link: https://lore.kernel.org/r/bc4f29eb502ccf93cd2ffd98db0e319fa7d0f247.1597408126.git.vaibhav.sr@gmail.com
Signed-off-by: Greg Kroah-Hartman <[email protected]>
  • Loading branch information
agarwalvaibhav authored and gregkh committed Sep 23, 2020
1 parent d95d829 commit 8b7e718
Showing 1 changed file with 15 additions and 14 deletions.
29 changes: 15 additions & 14 deletions drivers/staging/greybus/audio_topology.c
Original file line number Diff line number Diff line change
Expand Up @@ -462,6 +462,15 @@ static int gbcodec_mixer_dapm_ctl_put(struct snd_kcontrol *kcontrol,
val = ucontrol->value.integer.value[0] & mask;
connect = !!val;

ret = gb_pm_runtime_get_sync(bundle);
if (ret)
return ret;

ret = gb_audio_gb_get_control(module->mgmt_connection, data->ctl_id,
GB_AUDIO_INVALID_INDEX, &gbvalue);
if (ret)
goto exit;

/* update ucontrol */
if (gbvalue.value.integer_value[0] != val) {
for (wi = 0; wi < wlist->num_widgets; wi++) {
Expand All @@ -475,25 +484,17 @@ static int gbcodec_mixer_dapm_ctl_put(struct snd_kcontrol *kcontrol,
gbvalue.value.integer_value[0] =
ucontrol->value.integer.value[0];

ret = gb_pm_runtime_get_sync(bundle);
if (ret)
return ret;

ret = gb_audio_gb_set_control(module->mgmt_connection,
data->ctl_id,
GB_AUDIO_INVALID_INDEX, &gbvalue);

gb_pm_runtime_put_autosuspend(bundle);

if (ret) {
dev_err_ratelimited(codec->dev,
"%d:Error in %s for %s\n", ret,
__func__, kcontrol->id.name);
return ret;
}
}

return 0;
exit:
gb_pm_runtime_put_autosuspend(bundle);
if (ret)
dev_err_ratelimited(codec_dev, "%d:Error in %s for %s\n", ret,
__func__, kcontrol->id.name);
return ret;
}

#define SOC_DAPM_MIXER_GB(xname, kcount, data) \
Expand Down

0 comments on commit 8b7e718

Please sign in to comment.