diff options
author | Takashi Iwai <tiwai@suse.de> | 2015-08-17 12:57:32 (GMT) |
---|---|---|
committer | Takashi Iwai <tiwai@suse.de> | 2015-08-17 13:12:04 (GMT) |
commit | 1d260d7b3b03f96dfbc9781ec046edc729220f09 (patch) | |
tree | e4b17d933d66eae40dfd5c62f357dd9c057254d1 /sound/pci/hda/hda_proc.c | |
parent | cc75cdfe1d64585d82013632b81199b1e9f1da97 (diff) | |
download | linux-1d260d7b3b03f96dfbc9781ec046edc729220f09.tar.xz |
ALSA: hda/proc - Fix racy string access for power states
The power states in a proc file are printed in a racy manner on a
single static string buffer. Fix it by calling snd_iprintf() directly
for each state instead of processing on a temporary buffer.
Signed-off-by: Takashi Iwai <tiwai@suse.de>
Diffstat (limited to 'sound/pci/hda/hda_proc.c')
-rw-r--r-- | sound/pci/hda/hda_proc.c | 28 |
1 files changed, 10 insertions, 18 deletions
diff --git a/sound/pci/hda/hda_proc.c b/sound/pci/hda/hda_proc.c index 5efcffc3..033aa84 100644 --- a/sound/pci/hda/hda_proc.c +++ b/sound/pci/hda/hda_proc.c @@ -36,21 +36,6 @@ MODULE_PARM_DESC(dump_coef, "Dump processing coefficients in codec proc file (-1 #define param_read(codec, nid, parm) \ snd_hdac_read_parm_uncached(&(codec)->core, nid, parm) -static char *bits_names(unsigned int bits, const char * const names[], int size) -{ - int i, n; - static char buf[128]; - - for (i = 0, n = 0; i < size; i++) { - if (bits & (1U<<i) && names[i]) - n += snprintf(buf + n, sizeof(buf) - n, " %s", - names[i]); - } - buf[n] = '\0'; - - return buf; -} - static const char *get_wid_type_name(unsigned int wid_value) { static const char * const names[16] = { @@ -555,9 +540,16 @@ static void print_power_state(struct snd_info_buffer *buffer, int sup = param_read(codec, nid, AC_PAR_POWER_STATE); int pwr = snd_hda_codec_read(codec, nid, 0, AC_VERB_GET_POWER_STATE, 0); - if (sup != -1) - snd_iprintf(buffer, " Power states: %s\n", - bits_names(sup, names, ARRAY_SIZE(names))); + if (sup != -1) { + int i; + + snd_iprintf(buffer, " Power states: "); + for (i = 0; i < ARRAY_SIZE(names); i++) { + if (sup & (1U << i)) + snd_iprintf(buffer, " %s", names[i]); + } + snd_iprintf(buffer, "\n"); + } snd_iprintf(buffer, " Power: setting=%s, actual=%s", get_pwr_state(pwr & AC_PWRST_SETTING), |