mirror of
https://github.com/hardkernel/linux.git
synced 2026-06-07 19:30:30 +09:00
ASoC: pcm: Fix possible buffer overflow in dpcm state sysfs output
commit6c89ffea60upstream. dpcm_show_state() invokes multiple snprintf() calls to concatenate formatted strings on the fixed size buffer. The usage of snprintf() is supposed for avoiding the buffer overflow, but it doesn't work as expected because snprintf() doesn't return the actual output size but the size to be written. Fix this bug by replacing all snprintf() calls with scnprintf() calls. Fixes:f86dcef87b("ASoC: dpcm: Add debugFS support for DPCM") Signed-off-by: Takashi Iwai <tiwai@suse.de> Acked-by: Cezary Rojewski <cezary.rojewski@intel.com> Link: https://lore.kernel.org/r/20200218111737.14193-4-tiwai@suse.de Signed-off-by: Mark Brown <broonie@kernel.org> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
committed by
Greg Kroah-Hartman
parent
2aa6a19ec4
commit
9191f26b9d
@@ -3357,16 +3357,16 @@ static ssize_t dpcm_show_state(struct snd_soc_pcm_runtime *fe,
|
||||
ssize_t offset = 0;
|
||||
|
||||
/* FE state */
|
||||
offset += snprintf(buf + offset, size - offset,
|
||||
offset += scnprintf(buf + offset, size - offset,
|
||||
"[%s - %s]\n", fe->dai_link->name,
|
||||
stream ? "Capture" : "Playback");
|
||||
|
||||
offset += snprintf(buf + offset, size - offset, "State: %s\n",
|
||||
offset += scnprintf(buf + offset, size - offset, "State: %s\n",
|
||||
dpcm_state_string(fe->dpcm[stream].state));
|
||||
|
||||
if ((fe->dpcm[stream].state >= SND_SOC_DPCM_STATE_HW_PARAMS) &&
|
||||
(fe->dpcm[stream].state <= SND_SOC_DPCM_STATE_STOP))
|
||||
offset += snprintf(buf + offset, size - offset,
|
||||
offset += scnprintf(buf + offset, size - offset,
|
||||
"Hardware Params: "
|
||||
"Format = %s, Channels = %d, Rate = %d\n",
|
||||
snd_pcm_format_name(params_format(params)),
|
||||
@@ -3374,10 +3374,10 @@ static ssize_t dpcm_show_state(struct snd_soc_pcm_runtime *fe,
|
||||
params_rate(params));
|
||||
|
||||
/* BEs state */
|
||||
offset += snprintf(buf + offset, size - offset, "Backends:\n");
|
||||
offset += scnprintf(buf + offset, size - offset, "Backends:\n");
|
||||
|
||||
if (list_empty(&fe->dpcm[stream].be_clients)) {
|
||||
offset += snprintf(buf + offset, size - offset,
|
||||
offset += scnprintf(buf + offset, size - offset,
|
||||
" No active DSP links\n");
|
||||
goto out;
|
||||
}
|
||||
@@ -3386,16 +3386,16 @@ static ssize_t dpcm_show_state(struct snd_soc_pcm_runtime *fe,
|
||||
struct snd_soc_pcm_runtime *be = dpcm->be;
|
||||
params = &dpcm->hw_params;
|
||||
|
||||
offset += snprintf(buf + offset, size - offset,
|
||||
offset += scnprintf(buf + offset, size - offset,
|
||||
"- %s\n", be->dai_link->name);
|
||||
|
||||
offset += snprintf(buf + offset, size - offset,
|
||||
offset += scnprintf(buf + offset, size - offset,
|
||||
" State: %s\n",
|
||||
dpcm_state_string(be->dpcm[stream].state));
|
||||
|
||||
if ((be->dpcm[stream].state >= SND_SOC_DPCM_STATE_HW_PARAMS) &&
|
||||
(be->dpcm[stream].state <= SND_SOC_DPCM_STATE_STOP))
|
||||
offset += snprintf(buf + offset, size - offset,
|
||||
offset += scnprintf(buf + offset, size - offset,
|
||||
" Hardware Params: "
|
||||
"Format = %s, Channels = %d, Rate = %d\n",
|
||||
snd_pcm_format_name(params_format(params)),
|
||||
|
||||
Reference in New Issue
Block a user