Copy the input string so that we don't have to use a static buffer and virStrncpy. Signed-off-by: Peter Krempa <pkrempa@xxxxxxxxxx> --- src/libxl/xen_common.c | 46 +++++++++++++++++------------------------- 1 file changed, 19 insertions(+), 27 deletions(-) diff --git a/src/libxl/xen_common.c b/src/libxl/xen_common.c index 09c74dcb53..1c71f69209 100644 --- a/src/libxl/xen_common.c +++ b/src/libxl/xen_common.c @@ -1332,38 +1332,30 @@ xenParseSxprSound(virDomainDefPtr def, def->sounds[def->nsounds++] = sound; } } else { - char model[10]; - const char *offset = str, *offset2; - - do { - int len; - virDomainSoundDefPtr sound; - offset2 = strchr(offset, ','); - if (offset2) - len = (offset2 - offset); - else - len = strlen(offset); - if (virStrncpy(model, offset, len, sizeof(model)) < 0) { - virReportError(VIR_ERR_INTERNAL_ERROR, - _("Sound model %s too big for destination"), - offset); - return -1; - } + g_autofree char *sounds = g_strdup(str); + char *sound = sounds; + int model; - sound = g_new0(virDomainSoundDef, 1); + while (*sound != '\0') { + char *next = strchr(sound, ','); + virDomainSoundDefPtr snddef; - if ((sound->model = virDomainSoundModelTypeFromString(model)) < 0) { - VIR_FREE(sound); - return -1; - } + if (next) + *next = '\0'; - if (VIR_APPEND_ELEMENT(def->sounds, def->nsounds, sound) < 0) { - virDomainSoundDefFree(sound); + if ((model = virDomainSoundModelTypeFromString(sound)) < 0) return -1; - } - offset = offset2 ? offset2 + 1 : NULL; - } while (offset); + snddef = g_new0(virDomainSoundDef, 1); + snddef->model = model; + + ignore_value(VIR_APPEND_ELEMENT(def->sounds, def->nsounds, snddef)); + + if (!next) + break; + + sound = next + 1; + } } return 0; -- 2.29.2