[PATCH 09/16] xenParseSxprSound: Refactor parsing of model list

Peter Krempa pkrempa at redhat.com
Tue Mar 2 14:49:26 UTC 2021


Copy the input string so that we don't have to use a static buffer and
virStrncpy.

Signed-off-by: Peter Krempa <pkrempa at 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




More information about the libvir-list mailing list