* [PATCH] ASoC: SOF: topology: Move a variable assignment behind condition checks in sof_dai_load()
[not found] ` <1a11455f-ab57-dce0-1677-6beb8492a257@web.de>
@ 2023-04-13 12:10 ` Markus Elfring
2023-04-19 18:54 ` [PATCH] ASoC: SOF: Intel: hda-stream: Move three variable assignments behind condition checks in hda_dsp_iccmax_stream_hw_params() Markus Elfring
1 sibling, 0 replies; 4+ messages in thread
From: Markus Elfring @ 2023-04-13 12:10 UTC (permalink / raw)
To: kernel-janitors, alsa-devel, sound-open-firmware, Bard Liao,
Daniel Baluta, Jaroslav Kysela, Kai Vehmanen, Keyon Jie,
Liam Girdwood, Mark Brown, Peter Ujfalusi, Pierre-Louis Bossart,
Ranjani Sridharan, Takashi Iwai
Cc: cocci, LKML
Date: Thu, 13 Apr 2023 13:56:44 +0200
The address of a data structure member was determined before
a corresponding null pointer check in the implementation of
the function “sof_dai_load”.
Thus avoid the risk for undefined behaviour by moving the assignment
for the local variable “private” behind some condition checks.
This issue was detected by using the Coccinelle software.
Fixes: c5232c0171428f005a3204e1c264231fb5999b28 ("ASoC: SOF: topology: parse and store d0i3_compatible flag")
Signed-off-by: Markus Elfring <elfring@users.sourceforge.net>
---
sound/soc/sof/topology.c | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/sound/soc/sof/topology.c b/sound/soc/sof/topology.c
index d3d536b0a8f5..3fffe3826160 100644
--- a/sound/soc/sof/topology.c
+++ b/sound/soc/sof/topology.c
@@ -1680,7 +1680,7 @@ static int sof_dai_load(struct snd_soc_component *scomp, int index,
struct snd_sof_dev *sdev = snd_soc_component_get_drvdata(scomp);
const struct sof_ipc_pcm_ops *ipc_pcm_ops = sof_ipc_get_ops(sdev, pcm);
struct snd_soc_tplg_stream_caps *caps;
- struct snd_soc_tplg_private *private = &pcm->priv;
+ struct snd_soc_tplg_private *private;
struct snd_sof_pcm *spcm;
int stream;
int ret;
@@ -1716,6 +1716,7 @@ static int sof_dai_load(struct snd_soc_component *scomp, int index,
dai_drv->dobj.private = spcm;
list_add(&spcm->list, &sdev->pcm_list);
+ private = &pcm->priv;
ret = sof_parse_tokens(scomp, spcm, stream_tokens,
ARRAY_SIZE(stream_tokens), private->array,
le32_to_cpu(private->size));
--
2.40.0
^ permalink raw reply related [flat|nested] 4+ messages in thread
* [PATCH] ASoC: SOF: Intel: hda-stream: Move three variable assignments behind condition checks in hda_dsp_iccmax_stream_hw_params()
[not found] ` <1a11455f-ab57-dce0-1677-6beb8492a257@web.de>
2023-04-13 12:10 ` [PATCH] ASoC: SOF: topology: Move a variable assignment behind condition checks in sof_dai_load() Markus Elfring
@ 2023-04-19 18:54 ` Markus Elfring
2023-04-19 19:03 ` Pierre-Louis Bossart
1 sibling, 1 reply; 4+ messages in thread
From: Markus Elfring @ 2023-04-19 18:54 UTC (permalink / raw)
To: kernel-janitors, alsa-devel, sound-open-firmware, Bard Liao,
Daniel Baluta, Jaroslav Kysela, Kai Vehmanen, Liam Girdwood,
Mark Brown, Peter Ujfalusi, Pierre-Louis Bossart, Rander Wang,
Ranjani Sridharan, Takashi Iwai
Cc: cocci, LKML
Date: Wed, 19 Apr 2023 20:42:19 +0200
The address of a data structure member was determined before
a corresponding null pointer check in the implementation of
the function “hda_dsp_iccmax_stream_hw_params”.
Thus avoid the risk for undefined behaviour by moving the assignment
for three local variables behind some condition checks.
This issue was detected by using the Coccinelle software.
Fixes: 7d88b9608142f95ccdd3dfb190da4a5faddb1cc7 ("ASoC: SOF: Intel: hdac_ext_stream: consistent prefixes for variables/members")
Signed-off-by: Markus Elfring <elfring@users.sourceforge.net>
---
sound/soc/sof/intel/hda-stream.c | 11 ++++++++---
1 file changed, 8 insertions(+), 3 deletions(-)
diff --git a/sound/soc/sof/intel/hda-stream.c b/sound/soc/sof/intel/hda-stream.c
index 79d818e6a0fa..9c44127014fc 100644
--- a/sound/soc/sof/intel/hda-stream.c
+++ b/sound/soc/sof/intel/hda-stream.c
@@ -407,10 +407,10 @@ int hda_dsp_iccmax_stream_hw_params(struct snd_sof_dev *sdev, struct hdac_ext_st
struct snd_dma_buffer *dmab,
struct snd_pcm_hw_params *params)
{
- struct hdac_stream *hstream = &hext_stream->hstream;
- int sd_offset = SOF_STREAM_SD_OFFSET(hstream);
+ struct hdac_stream *hstream;
+ int sd_offset;
int ret;
- u32 mask = 0x1 << hstream->index;
+ u32 mask;
if (!hext_stream) {
dev_err(sdev->dev, "error: no stream available\n");
@@ -422,9 +422,12 @@ int hda_dsp_iccmax_stream_hw_params(struct snd_sof_dev *sdev, struct hdac_ext_st
return -ENODEV;
}
+ hstream = &hext_stream->hstream;
if (hstream->posbuf)
*hstream->posbuf = 0;
+ sd_offset = SOF_STREAM_SD_OFFSET(hstream);
+
/* reset BDL address */
snd_sof_dsp_write(sdev, HDA_DSP_HDA_BAR,
sd_offset + SOF_HDA_ADSP_REG_SD_BDLPL,
@@ -459,6 +462,8 @@ int hda_dsp_iccmax_stream_hw_params(struct snd_sof_dev *sdev, struct hdac_ext_st
sd_offset + SOF_HDA_ADSP_REG_SD_LVI,
0xffff, (hstream->frags - 1));
+ mask = 0x1 << hstream->index;
+
/* decouple host and link DMA, enable DSP features */
snd_sof_dsp_update_bits(sdev, HDA_DSP_PP_BAR, SOF_HDA_REG_PP_PPCTL,
mask, mask);
--
2.40.0
^ permalink raw reply related [flat|nested] 4+ messages in thread
* Re: [PATCH] ASoC: SOF: Intel: hda-stream: Move three variable assignments behind condition checks in hda_dsp_iccmax_stream_hw_params()
2023-04-19 18:54 ` [PATCH] ASoC: SOF: Intel: hda-stream: Move three variable assignments behind condition checks in hda_dsp_iccmax_stream_hw_params() Markus Elfring
@ 2023-04-19 19:03 ` Pierre-Louis Bossart
2023-04-24 14:56 ` Markus Elfring
0 siblings, 1 reply; 4+ messages in thread
From: Pierre-Louis Bossart @ 2023-04-19 19:03 UTC (permalink / raw)
To: Markus Elfring, kernel-janitors, alsa-devel, sound-open-firmware,
Bard Liao, Daniel Baluta, Jaroslav Kysela, Kai Vehmanen,
Liam Girdwood, Mark Brown, Peter Ujfalusi, Rander Wang,
Ranjani Sridharan, Takashi Iwai
Cc: cocci, LKML
On 4/19/23 13:54, Markus Elfring wrote:
> Date: Wed, 19 Apr 2023 20:42:19 +0200
>
> The address of a data structure member was determined before
> a corresponding null pointer check in the implementation of
> the function “hda_dsp_iccmax_stream_hw_params”.
>
> Thus avoid the risk for undefined behaviour by moving the assignment
> for three local variables behind some condition checks.
>
> This issue was detected by using the Coccinelle software.
>
> Fixes: 7d88b9608142f95ccdd3dfb190da4a5faddb1cc7 ("ASoC: SOF: Intel: hdac_ext_stream: consistent prefixes for variables/members")
> Signed-off-by: Markus Elfring <elfring@users.sourceforge.net>
Yes indeed, for some reason this was fixed in
hda_dsp_stream_hw_params() but not in the
hda_dsp_iccmax_stream_hw_params() variant.
Could we however use the same code as in hda_dsp_stream_hw_params() for
consistency?
if (!hext_stream) {
dev_err(sdev->dev, "error: no stream available\n");
return -ENODEV;
}
if (!dmab) {
dev_err(sdev->dev, "error: no dma buffer allocated!\n");
return -ENODEV;
}
hstream = &hext_stream->hstream;
sd_offset = SOF_STREAM_SD_OFFSET(hstream);
mask = BIT(hstream->index);
Thanks!
> ---
> sound/soc/sof/intel/hda-stream.c | 11 ++++++++---
> 1 file changed, 8 insertions(+), 3 deletions(-)
>
> diff --git a/sound/soc/sof/intel/hda-stream.c b/sound/soc/sof/intel/hda-stream.c
> index 79d818e6a0fa..9c44127014fc 100644
> --- a/sound/soc/sof/intel/hda-stream.c
> +++ b/sound/soc/sof/intel/hda-stream.c
> @@ -407,10 +407,10 @@ int hda_dsp_iccmax_stream_hw_params(struct snd_sof_dev *sdev, struct hdac_ext_st
> struct snd_dma_buffer *dmab,
> struct snd_pcm_hw_params *params)
> {
> - struct hdac_stream *hstream = &hext_stream->hstream;
> - int sd_offset = SOF_STREAM_SD_OFFSET(hstream);
> + struct hdac_stream *hstream;
> + int sd_offset;
> int ret;
> - u32 mask = 0x1 << hstream->index;
> + u32 mask;
>
> if (!hext_stream) {
> dev_err(sdev->dev, "error: no stream available\n");
> @@ -422,9 +422,12 @@ int hda_dsp_iccmax_stream_hw_params(struct snd_sof_dev *sdev, struct hdac_ext_st
> return -ENODEV;
> }
>
> + hstream = &hext_stream->hstream;
> if (hstream->posbuf)
> *hstream->posbuf = 0;
>
> + sd_offset = SOF_STREAM_SD_OFFSET(hstream);
> +
> /* reset BDL address */
> snd_sof_dsp_write(sdev, HDA_DSP_HDA_BAR,
> sd_offset + SOF_HDA_ADSP_REG_SD_BDLPL,
> @@ -459,6 +462,8 @@ int hda_dsp_iccmax_stream_hw_params(struct snd_sof_dev *sdev, struct hdac_ext_st
> sd_offset + SOF_HDA_ADSP_REG_SD_LVI,
> 0xffff, (hstream->frags - 1));
>
> + mask = 0x1 << hstream->index;
> +
> /* decouple host and link DMA, enable DSP features */
> snd_sof_dsp_update_bits(sdev, HDA_DSP_PP_BAR, SOF_HDA_REG_PP_PPCTL,
> mask, mask);
> --
> 2.40.0
>
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [PATCH] ASoC: SOF: Intel: hda-stream: Move three variable assignments behind condition checks in hda_dsp_iccmax_stream_hw_params()
2023-04-19 19:03 ` Pierre-Louis Bossart
@ 2023-04-24 14:56 ` Markus Elfring
0 siblings, 0 replies; 4+ messages in thread
From: Markus Elfring @ 2023-04-24 14:56 UTC (permalink / raw)
To: Pierre-Louis Bossart, kernel-janitors, alsa-devel,
sound-open-firmware, Bard Liao, Daniel Baluta, Jaroslav Kysela,
Kai Vehmanen, Liam Girdwood, Mark Brown, Peter Ujfalusi,
Rander Wang, Ranjani Sridharan, Takashi Iwai
Cc: cocci, LKML
>> The address of a data structure member was determined before
>> a corresponding null pointer check in the implementation of
>> the function “hda_dsp_iccmax_stream_hw_params”.
>>
>> Thus avoid the risk for undefined behaviour by moving the assignment
>> for three local variables behind some condition checks.
>>
>> This issue was detected by using the Coccinelle software.
>>
>> Fixes: 7d88b9608142f95ccdd3dfb190da4a5faddb1cc7 ("ASoC: SOF: Intel: hdac_ext_stream: consistent prefixes for variables/members")
>> Signed-off-by: Markus Elfring <elfring@users.sourceforge.net>
>
> Yes indeed, for some reason this was fixed in
> hda_dsp_stream_hw_params() but not in the
> hda_dsp_iccmax_stream_hw_params() variant.
Would Peter Ujfalusi like to support similar source code adjustments
also according to his commit 09255c7ed8ca1f1ed99357b845d2f63fe2ef3e1e
("ASoC: SOF: Intel: hda-stream: Do not dereference hstream until it is safe")
from 2023-04-04?
> Could we however use the same code as in hda_dsp_stream_hw_params() for consistency?
…
> hstream = &hext_stream->hstream;
> sd_offset = SOF_STREAM_SD_OFFSET(hstream);
> mask = BIT(hstream->index);
Can it matter to move such assignment statements a bit closer to subsequent statements?
Regards,
Markus
^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2023-04-24 14:58 UTC | newest]
Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
[not found] <40c60719-4bfe-b1a4-ead7-724b84637f55@web.de>
[not found] ` <1a11455f-ab57-dce0-1677-6beb8492a257@web.de>
2023-04-13 12:10 ` [PATCH] ASoC: SOF: topology: Move a variable assignment behind condition checks in sof_dai_load() Markus Elfring
2023-04-19 18:54 ` [PATCH] ASoC: SOF: Intel: hda-stream: Move three variable assignments behind condition checks in hda_dsp_iccmax_stream_hw_params() Markus Elfring
2023-04-19 19:03 ` Pierre-Louis Bossart
2023-04-24 14:56 ` Markus Elfring
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox