[PATCH 04/40] qemuDomainGetPreservedMounts: Refactor to return NULL-terminated string lists

Peter Krempa pkrempa at redhat.com
Sat Feb 6 08:32:26 UTC 2021


Refactor the handling of internals so that NULL-terminated lists are
always returned.

Signed-off-by: Peter Krempa <pkrempa at redhat.com>
---
 src/qemu/qemu_namespace.c | 56 +++++++++++++++++++++------------------
 1 file changed, 30 insertions(+), 26 deletions(-)

diff --git a/src/qemu/qemu_namespace.c b/src/qemu/qemu_namespace.c
index 35fe177bef..27a78c86e4 100644
--- a/src/qemu/qemu_namespace.c
+++ b/src/qemu/qemu_namespace.c
@@ -108,7 +108,7 @@ qemuDomainGetPreservedMountPath(virQEMUDriverConfigPtr cfg,
  * a) save all FSs mounted under /dev to @devPath
  * b) generate backup path for all the entries in a)
  *
- * Any of the return pointers can be NULL.
+ * Any of the return pointers can be NULL. Both arrays are NULL-terminated.
  *
  * Returns 0 on success, -1 otherwise (with error reported)
  */
@@ -119,18 +119,20 @@ qemuDomainGetPreservedMounts(virQEMUDriverConfigPtr cfg,
                              char ***devSavePath,
                              size_t *ndevPath)
 {
-    char **paths = NULL, **mounts = NULL;
-    size_t i, j, nmounts;
+    g_auto(GStrv) mounts = NULL;
+    size_t nmounts = 0;
+    g_auto(GStrv) paths = NULL;
+    g_auto(GStrv) savePaths = NULL;
+    size_t i;

-    if (virFileGetMountSubtree(QEMU_PROC_MOUNTS, "/dev",
-                               &mounts, &nmounts) < 0)
-        goto error;
+    if (ndevPath)
+        *ndevPath = 0;

-    if (!nmounts) {
-        if (ndevPath)
-            *ndevPath = 0;
+    if (virFileGetMountSubtree(QEMU_PROC_MOUNTS, "/dev", &mounts, &nmounts) < 0)
+        return -1;
+
+    if (nmounts == 0)
         return 0;
-    }

     /* There can be nested mount points. For instance
      * /dev/shm/blah can be a mount point and /dev/shm too. It
@@ -142,7 +144,8 @@ qemuDomainGetPreservedMounts(virQEMUDriverConfigPtr cfg,
      * just the first element. Think about it.
      */
     for (i = 1; i < nmounts; i++) {
-        j = i + 1;
+        size_t j = i + 1;
+
         while (j < nmounts) {
             char *c = STRSKIP(mounts[j], mounts[i]);

@@ -155,32 +158,33 @@ qemuDomainGetPreservedMounts(virQEMUDriverConfigPtr cfg,
         }
     }

-    paths = g_new0(char *, nmounts);
+    /* mounts may not be NULL-terminated at this point, but we convert it into
+     * 'paths' which is NULL-terminated */

-    for (i = 0; i < nmounts; i++) {
-        if (!(paths[i] = qemuDomainGetPreservedMountPath(cfg, vm, mounts[i])))
-            goto error;
+    paths = g_new0(char *, nmounts + 1);
+
+    for (i = 0; i < nmounts; i++)
+        paths[i] = g_steal_pointer(&mounts[i]);
+
+    if (devSavePath) {
+        savePaths = g_new0(char *, nmounts + 1);
+
+        for (i = 0; i < nmounts; i++) {
+            if (!(savePaths[i] = qemuDomainGetPreservedMountPath(cfg, vm, paths[i])))
+                return -1;
+        }
     }

     if (devPath)
-        *devPath = mounts;
-    else
-        virStringListFreeCount(mounts, nmounts);
+        *devPath = g_steal_pointer(&paths);

     if (devSavePath)
-        *devSavePath = paths;
-    else
-        virStringListFreeCount(paths, nmounts);
+        *devSavePath = g_steal_pointer(&savePaths);

     if (ndevPath)
         *ndevPath = nmounts;

     return 0;
-
- error:
-    virStringListFreeCount(mounts, nmounts);
-    virStringListFreeCount(paths, nmounts);
-    return -1;
 }


-- 
2.29.2




More information about the libvir-list mailing list