Copy the input string so that we don't have to use a static buffer and
virStrncpy.
Signed-off-by: Peter Krempa <pkrempa(a)redhat.com>
---
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