10 Nov
2014
10 Nov
'14
8:24 p.m.
At Mon, 10 Nov 2014 12:59:18 -0600, Chris J Arges wrote:
+/*
- Create enumeration strings from device_info
- */
+int scarlett_create_strings_from_info(struct scarlett_device_info *info) +{
- int i = 0, j = 0;
Superfluous initializations.
- char **names;
- names = kmalloc_array(info->opt_master.len, sizeof(char *), GFP_KERNEL);
- if (!names) {
kfree(names);
Superfluous kfree().
return -ENOMEM;
- }
- for (i = 0; i < info->opt_master.len; i++) {
names[i] = kmalloc_array(SNDRV_CTL_ELEM_ID_NAME_MAXLEN,
sizeof(char), GFP_KERNEL);
Just use kmalloc().
if (!names[i]) {
for (j = 0; j < i-1; j++)
kfree(names[j]);
kfree(names);
return -ENOMEM;
}
if (i > info->mix_start) {
snprintf(names[i], SNDRV_CTL_ELEM_ID_NAME_MAXLEN,
"Mix %c", 'A'+(i - info->mix_start - 1));
} else if (i > info->adat_start) {
snprintf(names[i], SNDRV_CTL_ELEM_ID_NAME_MAXLEN,
"ADAT %d", i - info->adat_start);
} else if (i > info->spdif_start) {
snprintf(names[i], SNDRV_CTL_ELEM_ID_NAME_MAXLEN,
"SPDIF %d", i - info->spdif_start);
} else if (i > info->analog_start) {
snprintf(names[i], SNDRV_CTL_ELEM_ID_NAME_MAXLEN,
"Analog %d", i - info->analog_start);
} else if (i > info->pcm_start) {
snprintf(names[i], SNDRV_CTL_ELEM_ID_NAME_MAXLEN,
"PCM %d", i - info->pcm_start);
} else {
snprintf(names[i], SNDRV_CTL_ELEM_ID_NAME_MAXLEN,
"Off");
}
BTW, another way would be to use kasprintf() and directly assign to names[i]. It'll save memory usage a bit. Although this won't guarantee the max length, but these strings are obviously short enough, so no big worry about it.
But, it's really a small difference, so I don't mind either way.
However...
- }
- /* assign to the appropriate control */
- info->opt_master.names = (const char * const *)names;
- info->opt_matrix.names = (const char * const *)names;
... I guess these will be leaked without destructor? This has to be fixed. You need to add a flag indicating the need of kfree() and do it in the own destructor accordingly.
thanks,
Takashi