Using the list iterator variable outside the loop breaks iterator scope semantics and can result in invalid memory access if the loop completes without finding a match.
Introduce a dedicated iterator variable 'iter' for traversing codec->module_list and assign it to 'module' only upon finding a match.
Signed-off-by: Rahul Rao shreeramrahul94@gmail.com --- drivers/staging/greybus/audio_codec.c | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-)
diff --git a/drivers/staging/greybus/audio_codec.c b/drivers/staging/greybus/audio_codec.c index 6daa4e706792..f4c3090684bf 100644 --- a/drivers/staging/greybus/audio_codec.c +++ b/drivers/staging/greybus/audio_codec.c @@ -395,7 +395,7 @@ static int gbcodec_hw_params(struct snd_pcm_substream *substream, int ret; u8 sig_bits, channels; u32 format, rate; - struct gbaudio_module_info *module; + struct gbaudio_module_info *module = NULL, *iter; struct gbaudio_data_connection *data; struct gb_bundle *bundle; struct gbaudio_codec_info *codec = dev_get_drvdata(dai->dev); @@ -437,10 +437,12 @@ static int gbcodec_hw_params(struct snd_pcm_substream *substream, format = GB_AUDIO_PCM_FMT_S16_LE;
/* find the data connection */ - list_for_each_entry(module, &codec->module_list, list) { - data = find_data(module, dai->id); - if (data) + list_for_each_entry(iter, &codec->module_list, list) { + data = find_data(iter, dai->id); + if (data) { + module = iter; break; + } }
if (!data) {