Refactor the handling of internals so that NULL-terminated lists are
always returned.
Signed-off-by: Peter Krempa <pkrempa(a)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