There are a few cases where a string list is freed by an explicit
call of g_strfreev(), but the same result can be achieved by
g_atuo(GStrv).

Signed-off-by: Michal Privoznik <mpriv...@redhat.com>
---
 src/bhyve/bhyve_command.c           |  3 +--
 src/bhyve/bhyve_parse_command.c     | 22 +++++-----------
 src/libxl/libxl_conf.c              |  9 +++----
 src/libxl/xen_common.c              | 18 +++++--------
 src/libxl/xen_xl.c                  | 17 +++---------
 src/lxc/lxc_container.c             |  4 +--
 src/lxc/lxc_native.c                | 24 +++++------------
 src/qemu/qemu_driver.c              |  6 ++---
 src/remote/remote_daemon_dispatch.c |  3 +--
 src/remote/remote_driver.c          |  4 +--
 src/storage/storage_backend_rbd.c   |  3 +--
 src/util/vircgroup.c                |  3 +--
 src/util/vircgroupv2.c              |  4 +--
 src/util/virfirmware.c              |  6 ++---
 src/util/viruri.c                   |  3 +--
 src/vbox/vbox_common.c              | 12 +++------
 src/vbox/vbox_snapshot_conf.c       | 40 ++++++++++-------------------
 src/vbox/vbox_tmpl.c                |  3 +--
 src/vz/vz_sdk.c                     |  3 +--
 tests/qemumonitorjsontest.c         |  3 +--
 tests/vboxsnapshotxmltest.c         |  3 +--
 tests/virconftest.c                 |  3 +--
 tests/virfiletest.c                 |  3 +--
 tests/virstringtest.c               |  3 +--
 tools/virsh-host.c                  | 13 +++-------
 tools/virt-login-shell-helper.c     |  7 +++--
 tools/vsh.c                         |  4 +--
 27 files changed, 71 insertions(+), 155 deletions(-)

diff --git a/src/bhyve/bhyve_command.c b/src/bhyve/bhyve_command.c
index ab9d3026cc..cf858dfcd6 100644
--- a/src/bhyve/bhyve_command.c
+++ b/src/bhyve/bhyve_command.c
@@ -833,12 +833,11 @@ virBhyveProcessBuildDestroyCmd(struct _bhyveConn *driver 
G_GNUC_UNUSED,
 static void
 virAppendBootloaderArgs(virCommand *cmd, virDomainDef *def)
 {
-    char **blargs;
+    g_auto(GStrv) blargs = NULL;
 
     /* XXX: Handle quoted? */
     blargs = g_strsplit(def->os.bootloaderArgs, " ", 0);
     virCommandAddArgSet(cmd, (const char * const *)blargs);
-    g_strfreev(blargs);
 }
 
 static virCommand *
diff --git a/src/bhyve/bhyve_parse_command.c b/src/bhyve/bhyve_parse_command.c
index 76dcea6f21..f2c15f3aa5 100644
--- a/src/bhyve/bhyve_parse_command.c
+++ b/src/bhyve/bhyve_parse_command.c
@@ -127,7 +127,7 @@ bhyveCommandLineToArgv(const char *nativeConfig,
     const char *start;
     const char *next;
     char *line;
-    char **lines = NULL;
+    g_auto(GStrv) lines = NULL;
     size_t i;
     size_t line_count = 0;
     size_t lines_alloc = 0;
@@ -168,7 +168,7 @@ bhyveCommandLineToArgv(const char *nativeConfig,
 
     for (i = 0; i < line_count; i++) {
         size_t j;
-        char **arglist = NULL;
+        g_auto(GStrv) arglist = NULL;
         size_t args_count = 0;
         size_t args_alloc = 0;
 
@@ -223,23 +223,17 @@ bhyveCommandLineToArgv(const char *nativeConfig,
             if (!bhyve_argc)
                 goto error;
             for (j = 0; j < args_count; j++)
-                _bhyve_argv[j] = arglist[j];
+                _bhyve_argv[j] = g_steal_pointer(&arglist[j]);
             _bhyve_argv[j] = NULL;
             *bhyve_argc = args_count-1;
-            VIR_FREE(arglist);
         } else if (!_loader_argv) {
             VIR_REALLOC_N(_loader_argv, args_count + 1);
             if (!loader_argc)
                 goto error;
             for (j = 0; j < args_count; j++)
-                _loader_argv[j] = arglist[j];
+                _loader_argv[j] = g_steal_pointer(&arglist[j]);
             _loader_argv[j] = NULL;
             *loader_argc = args_count-1;
-            VIR_FREE(arglist);
-        } else {
-            /* To prevent a use-after-free here, only free the argument list
-             * when it is definitely not going to be used */
-            g_strfreev(arglist);
         }
     }
 
@@ -247,13 +241,11 @@ bhyveCommandLineToArgv(const char *nativeConfig,
     if (!(*bhyve_argv = _bhyve_argv))
         goto error;
 
-    g_strfreev(lines);
     return 0;
 
  error:
     VIR_FREE(_loader_argv);
     VIR_FREE(_bhyve_argv);
-    g_strfreev(lines);
     return -1;
 }
 
@@ -944,9 +936,9 @@ bhyveParseCommandLineString(const char* nativeConfig,
 {
     virDomainDef *def = NULL;
     int bhyve_argc = 0;
-    char **bhyve_argv = NULL;
+    g_auto(GStrv) bhyve_argv = NULL;
     int loader_argc = 0;
-    char **loader_argv = NULL;
+    g_auto(GStrv) loader_argv = NULL;
 
     if (!(def = virDomainDefNew(xmlopt)))
         goto cleanup;
@@ -982,8 +974,6 @@ bhyveParseCommandLineString(const char* nativeConfig,
     }
 
  cleanup:
-    g_strfreev(loader_argv);
-    g_strfreev(bhyve_argv);
     return def;
  error:
     virDomainDefFree(def);
diff --git a/src/libxl/libxl_conf.c b/src/libxl/libxl_conf.c
index 9f0739e1fa..f37c228139 100644
--- a/src/libxl/libxl_conf.c
+++ b/src/libxl/libxl_conf.c
@@ -1887,8 +1887,7 @@ int
 libxlDriverGetDom0MaxmemConf(libxlDriverConfig *cfg,
                              unsigned long long *maxmem)
 {
-    char **cmd_tokens = NULL;
-    char **mem_tokens = NULL;
+    g_auto(GStrv) cmd_tokens = NULL;
     size_t i;
     size_t j;
     libxl_physinfo physinfo;
@@ -1899,6 +1898,8 @@ libxlDriverGetDom0MaxmemConf(libxlDriverConfig *cfg,
         goto physmem;
 
     for (i = 0; cmd_tokens[i] != NULL; i++) {
+        g_auto(GStrv) mem_tokens = NULL;
+
         if (!STRPREFIX(cmd_tokens[i], "dom0_mem="))
             continue;
 
@@ -1934,8 +1935,6 @@ libxlDriverGetDom0MaxmemConf(libxlDriverConfig *cfg,
                 goto cleanup;
             }
         }
-        g_strfreev(mem_tokens);
-        mem_tokens = NULL;
     }
 
  physmem:
@@ -1950,8 +1949,6 @@ libxlDriverGetDom0MaxmemConf(libxlDriverConfig *cfg,
     ret = 0;
 
  cleanup:
-    g_strfreev(cmd_tokens);
-    g_strfreev(mem_tokens);
     return ret;
 }
 
diff --git a/src/libxl/xen_common.c b/src/libxl/xen_common.c
index 87f090f979..32c31d240e 100644
--- a/src/libxl/xen_common.c
+++ b/src/libxl/xen_common.c
@@ -1045,7 +1045,7 @@ xenParseVifBridge(virDomainNetDef *net, const char 
*bridge)
         /* 'bridge' string contains a bridge name and one or more vlan trunks 
*/
         size_t i;
         size_t nvlans = 0;
-        char **vlanstr_list = g_strsplit(bridge, ":", 0);
+        g_auto(GStrv) vlanstr_list = g_strsplit(bridge, ":", 0);
 
         if (!vlanstr_list)
             return -1;
@@ -1058,15 +1058,13 @@ xenParseVifBridge(virDomainNetDef *net, const char 
*bridge)
         net->vlan.tag = g_new0(unsigned int, nvlans);
 
         for (i = 1; i <= nvlans; i++) {
-            if (virStrToLong_ui(vlanstr_list[i], NULL, 10, &tag) < 0) {
-                g_strfreev(vlanstr_list);
+            if (virStrToLong_ui(vlanstr_list[i], NULL, 10, &tag) < 0)
                 return -1;
-            }
+
             net->vlan.tag[i - 1] = tag;
         }
         net->vlan.nTags = nvlans;
         net->vlan.trunk = true;
-        g_strfreev(vlanstr_list);
 
         net->virtPortProfile = g_new0(virNetDevVPortProfile, 1);
         net->virtPortProfile->virtPortType = 
VIR_NETDEV_VPORT_PROFILE_OPENVSWITCH;
@@ -1201,19 +1199,16 @@ xenParseVif(char *entry, const char *vif_typename)
             goto cleanup;
     }
     if (ip) {
-        char **ip_list = g_strsplit(ip, " ", 0);
+        g_auto(GStrv) ip_list = g_strsplit(ip, " ", 0);
         size_t i;
 
         if (!ip_list)
             goto cleanup;
 
         for (i = 0; ip_list[i]; i++) {
-            if (virDomainNetAppendIPAddress(net, ip_list[i], 0, 0) < 0) {
-                g_strfreev(ip_list);
+            if (virDomainNetAppendIPAddress(net, ip_list[i], 0, 0) < 0)
                 goto cleanup;
-            }
         }
-        g_strfreev(ip_list);
     }
 
     if (script && script[0])
@@ -1579,7 +1574,7 @@ char *
 xenMakeIPList(virNetDevIPInfo *guestIP)
 {
     size_t i;
-    char **address_array;
+    g_auto(GStrv) address_array = NULL;
     char *ret = NULL;
 
     address_array = g_new0(char *, guestIP->nips + 1);
@@ -1592,7 +1587,6 @@ xenMakeIPList(virNetDevIPInfo *guestIP)
     ret = g_strjoinv(" ", address_array);
 
  cleanup:
-    g_strfreev(address_array);
     return ret;
 }
 
diff --git a/src/libxl/xen_xl.c b/src/libxl/xen_xl.c
index 850786e5c9..05d4abbe81 100644
--- a/src/libxl/xen_xl.c
+++ b/src/libxl/xen_xl.c
@@ -246,8 +246,7 @@ static int
 xenParseXLCPUID(virConf *conf, virDomainDef *def)
 {
     g_autofree char *cpuid_str = NULL;
-    char **cpuid_pairs = NULL;
-    char **name_and_value = NULL;
+    g_auto(GStrv) cpuid_pairs = NULL;
     size_t i;
     int ret = -1;
     int policy;
@@ -283,7 +282,7 @@ xenParseXLCPUID(virConf *conf, virDomainDef *def)
     }
 
     for (i = 1; cpuid_pairs[i]; i++) {
-        name_and_value = g_strsplit(cpuid_pairs[i], "=", 2);
+        g_auto(GStrv) name_and_value = g_strsplit(cpuid_pairs[i], "=", 2);
         if (!name_and_value)
             goto cleanup;
         if (!name_and_value[0] || !name_and_value[1]) {
@@ -313,16 +312,11 @@ xenParseXLCPUID(virConf *conf, virDomainDef *def)
                                 xenTranslateCPUFeature(name_and_value[0], 
true),
                                 policy) < 0)
             goto cleanup;
-
-        g_strfreev(name_and_value);
-        name_and_value = NULL;
     }
 
     ret = 0;
 
  cleanup:
-    g_strfreev(name_and_value);
-    g_strfreev(cpuid_pairs);
     return ret;
 }
 
@@ -406,7 +400,6 @@ xenParseXLVnuma(virConf *conf,
 {
     int ret = -1;
     char *tmp = NULL;
-    char **token = NULL;
     size_t vcpus = 0;
     size_t nr_nodes = 0;
     size_t vnodeCnt = 0;
@@ -506,6 +499,7 @@ xenParseXLVnuma(virConf *conf,
                         vcpus += virBitmapCountBits(cpumask);
 
                     } else if (STRPREFIX(str, "vdistances")) {
+                        g_auto(GStrv) token = NULL;
                         size_t i, ndistances;
                         unsigned int value;
 
@@ -519,7 +513,6 @@ xenParseXLVnuma(virConf *conf,
                         VIR_FREE(tmp);
                         tmp = g_strdup(vtoken);
 
-                        g_strfreev(token);
                         if (!(token = g_strsplit(tmp, ",", 0)))
                             goto cleanup;
 
@@ -583,7 +576,6 @@ xenParseXLVnuma(virConf *conf,
  cleanup:
     if (ret)
         VIR_FREE(cpu);
-    g_strfreev(token);
     VIR_FREE(tmp);
 
     return ret;
@@ -1301,7 +1293,7 @@ xenFormatXLOS(virConf *conf, virDomainDef *def)
 static int
 xenFormatXLCPUID(virConf *conf, virDomainDef *def)
 {
-    char **cpuid_pairs = NULL;
+    g_auto(GStrv) cpuid_pairs = NULL;
     g_autofree char *cpuid_string = NULL;
     size_t i, j;
     int ret = -1;
@@ -1359,7 +1351,6 @@ xenFormatXLCPUID(virConf *conf, virDomainDef *def)
     ret = 0;
 
  cleanup:
-    g_strfreev(cpuid_pairs);
     return ret;
 }
 
diff --git a/src/lxc/lxc_container.c b/src/lxc/lxc_container.c
index d788e77196..13f2fd4c29 100644
--- a/src/lxc/lxc_container.c
+++ b/src/lxc/lxc_container.c
@@ -510,7 +510,7 @@ extern int pivot_root(const char * new_root, const char * 
put_old);
 static int lxcContainerUnmountSubtree(const char *prefix,
                                       bool isOldRootFS)
 {
-    char **mounts = NULL;
+    g_auto(GStrv) mounts = NULL;
     size_t nmounts = 0;
     size_t i;
     int saveErrno;
@@ -555,8 +555,6 @@ static int lxcContainerUnmountSubtree(const char *prefix,
     ret = 0;
 
  cleanup:
-    g_strfreev(mounts);
-
     return ret;
 }
 
diff --git a/src/lxc/lxc_native.c b/src/lxc/lxc_native.c
index 3840652912..f3b8e85143 100644
--- a/src/lxc/lxc_native.c
+++ b/src/lxc/lxc_native.c
@@ -107,8 +107,8 @@ static char ** lxcStringSplit(const char *string)
     g_autofree char *tmp = NULL;
     size_t i;
     size_t ntokens = 0;
-    char **parts;
-    char **result = NULL;
+    g_auto(GStrv) parts = NULL;
+    g_auto(GStrv) result = NULL;
 
     tmp = g_strdup(string);
 
@@ -132,12 +132,9 @@ static char ** lxcStringSplit(const char *string)
         result[ntokens - 2] = g_strdup(parts[i]);
     }
 
-    g_strfreev(parts);
-    return result;
+    return g_steal_pointer(&result);
 
  error:
-    g_strfreev(parts);
-    g_strfreev(result);
     return NULL;
 }
 
@@ -145,7 +142,7 @@ static lxcFstab *
 lxcParseFstabLine(char *fstabLine)
 {
     lxcFstab *fstab = NULL;
-    char **parts;
+    g_auto(GStrv) parts = NULL;
 
     if (!fstabLine)
         return NULL;
@@ -162,13 +159,10 @@ lxcParseFstabLine(char *fstabLine)
     fstab->type = g_strdup(parts[2]);
     fstab->options = g_strdup(parts[3]);
 
-    g_strfreev(parts);
-
     return fstab;
 
  error:
     lxcFstabFree(fstab);
-    g_strfreev(parts);
     return NULL;
 }
 
@@ -252,7 +246,7 @@ lxcAddFstabLine(virDomainDef *def, lxcFstab *fstab)
 {
     const char *src = NULL;
     g_autofree char *dst = NULL;
-    char **options = g_strsplit(fstab->options, ",", 0);
+    g_auto(GStrv) options = g_strsplit(fstab->options, ",", 0);
     bool readonly;
     int type = VIR_DOMAIN_FS_TYPE_MOUNT;
     unsigned long long usage = 0;
@@ -307,7 +301,6 @@ lxcAddFstabLine(virDomainDef *def, lxcFstab *fstab)
     ret = 1;
 
  cleanup:
-    g_strfreev(options);
     return ret;
 }
 
@@ -967,7 +960,7 @@ lxcSetCpusetTune(virDomainDef *def, virConf *properties)
 static int
 lxcBlkioDeviceWalkCallback(const char *name, virConfValue *value, void *data)
 {
-    char **parts = NULL;
+    g_auto(GStrv) parts = NULL;
     virBlkioDevice *device = NULL;
     virDomainDef *def = data;
     size_t i = 0;
@@ -1044,7 +1037,6 @@ lxcBlkioDeviceWalkCallback(const char *name, virConfValue 
*value, void *data)
     ret = 0;
 
  cleanup:
-    g_strfreev(parts);
     return ret;
 }
 
@@ -1072,7 +1064,7 @@ static void
 lxcSetCapDrop(virDomainDef *def, virConf *properties)
 {
     g_autofree char *value = NULL;
-    char **toDrop = NULL;
+    g_auto(GStrv) toDrop = NULL;
     const char *capString;
     size_t i;
 
@@ -1087,8 +1079,6 @@ lxcSetCapDrop(virDomainDef *def, virConf *properties)
     }
 
     def->features[VIR_DOMAIN_FEATURE_CAPABILITIES] = 
VIR_DOMAIN_CAPABILITIES_POLICY_ALLOW;
-
-    g_strfreev(toDrop);
 }
 
 virDomainDef *
diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
index 70b5f37e6b..a12ef2227e 100644
--- a/src/qemu/qemu_driver.c
+++ b/src/qemu/qemu_driver.c
@@ -1329,7 +1329,7 @@ qemuGetSchedInfo(unsigned long long *cpuWait,
 {
     g_autofree char *proc = NULL;
     g_autofree char *data = NULL;
-    char **lines = NULL;
+    g_auto(GStrv) lines = NULL;
     size_t i;
     int ret = -1;
     double val;
@@ -1392,7 +1392,6 @@ qemuGetSchedInfo(unsigned long long *cpuWait,
     ret = 0;
 
  cleanup:
-    g_strfreev(lines);
     return ret;
 }
 
@@ -12517,7 +12516,7 @@ qemuConnectBaselineHypervisorCPU(virConnectPtr conn,
     bool migratable;
     virCPUDef *cpu = NULL;
     char *cpustr = NULL;
-    char **features = NULL;
+    g_auto(GStrv) features = NULL;
 
     virCheckFlags(VIR_CONNECT_BASELINE_CPU_EXPAND_FEATURES |
                   VIR_CONNECT_BASELINE_CPU_MIGRATABLE, NULL);
@@ -12591,7 +12590,6 @@ qemuConnectBaselineHypervisorCPU(virConnectPtr conn,
  cleanup:
     virCPUDefListFree(cpus);
     virCPUDefFree(cpu);
-    g_strfreev(features);
 
     return cpustr;
 }
diff --git a/src/remote/remote_daemon_dispatch.c 
b/src/remote/remote_daemon_dispatch.c
index bcfeadc2ae..d8fb02a89d 100644
--- a/src/remote/remote_daemon_dispatch.c
+++ b/src/remote/remote_daemon_dispatch.c
@@ -5824,7 +5824,7 @@ remoteDispatchConnectGetCPUModelNames(virNetServer 
*server G_GNUC_UNUSED,
                                       remote_connect_get_cpu_model_names_ret 
*ret)
 {
     int len, rv = -1;
-    char **models = NULL;
+    g_auto(GStrv) models = NULL;
     virConnectPtr conn = remoteGetHypervisorConn(client);
 
     if (!conn)
@@ -5858,7 +5858,6 @@ remoteDispatchConnectGetCPUModelNames(virNetServer 
*server G_GNUC_UNUSED,
  cleanup:
     if (rv < 0)
         virNetMessageSaveError(rerr);
-    g_strfreev(models);
     return rv;
 }
 
diff --git a/src/remote/remote_driver.c b/src/remote/remote_driver.c
index 719fcf4297..8f094db68c 100644
--- a/src/remote/remote_driver.c
+++ b/src/remote/remote_driver.c
@@ -6266,7 +6266,7 @@ remoteConnectGetCPUModelNames(virConnectPtr conn,
 {
     int rv = -1;
     size_t i;
-    char **retmodels = NULL;
+    g_auto(GStrv) retmodels = NULL;
     remote_connect_get_cpu_model_names_args args;
     remote_connect_get_cpu_model_names_ret ret;
 
@@ -6307,8 +6307,6 @@ remoteConnectGetCPUModelNames(virConnectPtr conn,
     rv = ret.ret;
 
  cleanup:
-    g_strfreev(retmodels);
-
     xdr_free((xdrproc_t) xdr_remote_connect_get_cpu_model_names_ret, (char *) 
&ret);
 
  done:
diff --git a/src/storage/storage_backend_rbd.c 
b/src/storage/storage_backend_rbd.c
index 28b4b7fae6..8276ce20ab 100644
--- a/src/storage/storage_backend_rbd.c
+++ b/src/storage/storage_backend_rbd.c
@@ -659,7 +659,7 @@ virStorageBackendRBDRefreshPool(virStoragePoolObj *pool)
     virStorageBackendRBDState *ptr = NULL;
     struct rados_cluster_stat_t clusterstat;
     struct rados_pool_stat_t poolstat;
-    char **names = NULL;
+    g_auto(GStrv) names = NULL;
     size_t i;
 
     if (!(ptr = virStorageBackendRBDNewState(pool)))
@@ -724,7 +724,6 @@ virStorageBackendRBDRefreshPool(virStoragePoolObj *pool)
     ret = 0;
 
  cleanup:
-    g_strfreev(names);
     virStorageBackendRBDFreeState(&ptr);
     return ret;
 }
diff --git a/src/util/vircgroup.c b/src/util/vircgroup.c
index 37b63a2e2d..6234095827 100644
--- a/src/util/vircgroup.c
+++ b/src/util/vircgroup.c
@@ -851,7 +851,7 @@ virCgroupAddThread(virCgroup *group,
 static int
 virCgroupSetPartitionSuffix(const char *path, char **res)
 {
-    char **tokens;
+    g_auto(GStrv) tokens = NULL;
     size_t i;
     int ret = -1;
 
@@ -887,7 +887,6 @@ virCgroupSetPartitionSuffix(const char *path, char **res)
     ret = 0;
 
  cleanup:
-    g_strfreev(tokens);
     return ret;
 }
 
diff --git a/src/util/vircgroupv2.c b/src/util/vircgroupv2.c
index 8881d3a88a..4c110940cf 100644
--- a/src/util/vircgroupv2.c
+++ b/src/util/vircgroupv2.c
@@ -264,7 +264,7 @@ virCgroupV2ParseControllersFile(virCgroup *group,
     int rc;
     g_autofree char *contStr = NULL;
     g_autofree char *contFile = NULL;
-    char **contList = NULL;
+    g_auto(GStrv) contList = NULL;
     char **tmp;
 
     if (parent) {
@@ -300,8 +300,6 @@ virCgroupV2ParseControllersFile(virCgroup *group,
         tmp++;
     }
 
-    g_strfreev(contList);
-
     return 0;
 }
 
diff --git a/src/util/virfirmware.c b/src/util/virfirmware.c
index 258d13bb73..cc5e315b7a 100644
--- a/src/util/virfirmware.c
+++ b/src/util/virfirmware.c
@@ -59,7 +59,7 @@ int
 virFirmwareParse(const char *str, virFirmware *firmware)
 {
     int ret = -1;
-    char **token;
+    g_auto(GStrv) token = NULL;
 
     if (!(token = g_strsplit(str, ":", 0)))
         goto cleanup;
@@ -84,7 +84,6 @@ virFirmwareParse(const char *str, virFirmware *firmware)
 
     ret = 0;
  cleanup:
-    g_strfreev(token);
     return ret;
 }
 
@@ -95,7 +94,7 @@ virFirmwareParseList(const char *list,
                      size_t *nfirmwares)
 {
     int ret = -1;
-    char **token;
+    g_auto(GStrv) token = NULL;
     size_t i, j;
 
     if (!(token = g_strsplit(list, ":", 0)))
@@ -126,6 +125,5 @@ virFirmwareParseList(const char *list,
 
     ret = 0;
  cleanup:
-    g_strfreev(token);
     return ret;
 }
diff --git a/src/util/viruri.c b/src/util/viruri.c
index 252e4f598e..3c73188a55 100644
--- a/src/util/viruri.c
+++ b/src/util/viruri.c
@@ -349,7 +349,7 @@ int
 virURIResolveAlias(virConf *conf, const char *alias, char **uri)
 {
     int ret = -1;
-    char **aliases = NULL;
+    g_auto(GStrv) aliases = NULL;
 
     *uri = NULL;
 
@@ -358,7 +358,6 @@ virURIResolveAlias(virConf *conf, const char *alias, char 
**uri)
 
     if (aliases && *aliases) {
         ret = virURIFindAliasMatch(aliases, alias, uri);
-        g_strfreev(aliases);
     } else {
         ret = 0;
     }
diff --git a/src/vbox/vbox_common.c b/src/vbox/vbox_common.c
index 45e7225ae1..cc90e634a3 100644
--- a/src/vbox/vbox_common.c
+++ b/src/vbox/vbox_common.c
@@ -4559,16 +4559,16 @@ vboxSnapshotRedefine(virDomainPtr dom,
     char *currentSnapshotXmlFilePath = NULL;
     PRUnichar *machineNameUtf16 = NULL;
     char *machineName = NULL;
-    char **realReadWriteDisksPath = NULL;
+    g_auto(GStrv) realReadWriteDisksPath = NULL;
     int realReadWriteDisksPathSize = 0;
-    char **realReadOnlyDisksPath = NULL;
+    g_auto(GStrv) realReadOnlyDisksPath = NULL;
     int realReadOnlyDisksPathSize = 0;
     virVBoxSnapshotConfSnapshot *newSnapshotPtr = NULL;
     unsigned char snapshotUuid[VIR_UUID_BUFLEN];
     virVBoxSnapshotConfHardDisk **hardDiskToOpen = NULL;
     size_t hardDiskToOpenSize = 0;
     virVBoxSnapshotConfHardDisk *newHardDisk = NULL;
-    char **searchResultTab = NULL;
+    g_auto(GStrv) searchResultTab = NULL;
     ssize_t resultSize = 0;
     int it = 0;
     int jt = 0;
@@ -5371,9 +5371,6 @@ vboxSnapshotRedefine(virDomainPtr dom,
     VIR_FREE(currentSnapshotXmlFilePath);
     VBOX_UTF16_FREE(machineNameUtf16);
     VBOX_UTF8_FREE(machineName);
-    g_strfreev(realReadOnlyDisksPath);
-    g_strfreev(realReadWriteDisksPath);
-    g_strfreev(searchResultTab);
     virVboxSnapshotConfHardDiskFree(newHardDisk);
     VIR_FREE(hardDiskToOpen);
     VIR_FREE(newSnapshotPtr);
@@ -6792,7 +6789,7 @@ vboxDomainSnapshotDeleteMetadataOnly(virDomainSnapshotPtr 
snapshot)
     char *settingsFilepath = NULL;
     virVBoxSnapshotConfMachine *snapshotMachineDesc = NULL;
     int isCurrent = -1;
-    char **searchResultTab = NULL;
+    g_auto(GStrv) searchResultTab = NULL;
     ssize_t resultSize = 0;
     int it = 0;
     PRUnichar *machineNameUtf16 = NULL;
@@ -7195,7 +7192,6 @@ vboxDomainSnapshotDeleteMetadataOnly(virDomainSnapshotPtr 
snapshot)
     VBOX_RELEASE(machine);
     VBOX_UTF16_FREE(settingsFilePathUtf16);
     VBOX_UTF8_FREE(settingsFilepath);
-    g_strfreev(searchResultTab);
     VIR_FREE(snapshotMachineDesc);
     VBOX_UTF16_FREE(machineNameUtf16);
     VBOX_UTF8_FREE(machineName);
diff --git a/src/vbox/vbox_snapshot_conf.c b/src/vbox/vbox_snapshot_conf.c
index 65546b785e..5894ee1cac 100644
--- a/src/vbox/vbox_snapshot_conf.c
+++ b/src/vbox/vbox_snapshot_conf.c
@@ -38,7 +38,7 @@ 
virVBoxSnapshotConfCreateVBoxSnapshotConfHardDiskPtr(xmlNodePtr diskNode,
     virVBoxSnapshotConfHardDisk *hardDisk = NULL;
     xmlNodePtr *nodes = NULL;
     char *uuid = NULL;
-    char **searchTabResult = NULL;
+    g_auto(GStrv) searchTabResult = NULL;
     int resultSize = 0;
     size_t i = 0;
     int result = -1;
@@ -103,7 +103,6 @@ 
virVBoxSnapshotConfCreateVBoxSnapshotConfHardDiskPtr(xmlNodePtr diskNode,
     VIR_FREE(nodes);
     VIR_FREE(location);
     VIR_FREE(tmp);
-    g_strfreev(searchTabResult);
     if (result < 0) {
         virVboxSnapshotConfHardDiskFree(hardDisk);
         hardDisk = NULL;
@@ -184,7 +183,7 @@ virVBoxSnapshotConfRetrieveSnapshot(xmlNodePtr snapshotNode,
     xmlNodePtr snapshotsNode = NULL;
     xmlNodePtr *nodes = NULL;
     char *uuid = NULL;
-    char **searchTabResult = NULL;
+    g_auto(GStrv) searchTabResult = NULL;
     int resultSize = 0;
     size_t i = 0;
     int result = -1;
@@ -270,7 +269,6 @@ virVBoxSnapshotConfRetrieveSnapshot(xmlNodePtr snapshotNode,
     }
     VIR_FREE(nodes);
     VIR_FREE(uuid);
-    g_strfreev(searchTabResult);
     return snapshot;
 }
 
@@ -371,9 +369,9 @@ virVBoxSnapshotConfSerializeSnapshot(xmlNodePtr node,
     char *uuid = NULL;
     char *timeStamp = NULL;
 
-    char **firstRegex = NULL;
+    g_auto(GStrv) firstRegex = NULL;
     int firstRegexResult = 0;
-    char **secondRegex = NULL;
+    g_auto(GStrv) secondRegex = NULL;
     int secondRegexResult = 0;
 
     uuid = g_strdup_printf("{%s}", snapshot->uuid);
@@ -450,8 +448,6 @@ virVBoxSnapshotConfSerializeSnapshot(xmlNodePtr node,
         xmlUnlinkNode(snapshotsNode);
         xmlFreeNode(snapshotsNode);
     }
-    g_strfreev(firstRegex);
-    g_strfreev(secondRegex);
     VIR_FREE(uuid);
     VIR_FREE(timeStamp);
     return result;
@@ -581,7 +577,7 @@ virVBoxSnapshotConfLoadVboxFile(const char *filePath,
     g_autoptr(xmlXPathContext) xPathContext = NULL;
     char *currentStateModifiedString = NULL;
 
-    char **searchResultTab = NULL;
+    g_auto(GStrv) searchResultTab = NULL;
     ssize_t searchResultSize = 0;
     char *currentSnapshotAttribute = NULL;
 
@@ -719,7 +715,6 @@ virVBoxSnapshotConfLoadVboxFile(const char *filePath,
 
     VIR_FREE(currentStateModifiedString);
     VIR_FREE(currentSnapshotAttribute);
-    g_strfreev(searchResultTab);
     if (ret < 0) {
         virVBoxSnapshotConfMachineFree(machineDescription);
         machineDescription = NULL;
@@ -963,9 +958,9 @@ virVBoxSnapshotConfSaveVboxFile(virVBoxSnapshotConfMachine 
*machine,
     char *currentSnapshot = NULL;
     char *timeStamp = NULL;
 
-    char **firstRegex = NULL;
+    g_auto(GStrv) firstRegex = NULL;
     int firstRegexResult = 0;
-    char **secondRegex = NULL;
+    g_auto(GStrv) secondRegex = NULL;
     int secondRegexResult = 0;
 
     if (machine == NULL) {
@@ -1171,9 +1166,6 @@ 
virVBoxSnapshotConfSaveVboxFile(virVBoxSnapshotConfMachine *machine,
     xmlUnlinkNode(machineNode);
     xmlFreeNode(machineNode);
 
-
-    g_strfreev(firstRegex);
-    g_strfreev(secondRegex);
     return ret;
 }
 
@@ -1216,7 +1208,7 @@ virVBoxSnapshotConfGetRWDisksPathsFromLibvirtXML(const 
char *filePath,
 {
     int result = -1;
     size_t i = 0;
-    char **ret = NULL;
+    g_auto(GStrv) ret = NULL;
     g_autoptr(xmlDoc) xml = NULL;
     g_autoptr(xmlXPathContext) xPathContext = NULL;
     xmlNodePtr *nodes = NULL;
@@ -1253,15 +1245,12 @@ virVBoxSnapshotConfGetRWDisksPathsFromLibvirtXML(const 
char *filePath,
         if (sourceNode)
             ret[i] = virXMLPropString(sourceNode, "file");
     }
+    *rwDisksPath = g_steal_pointer(&ret);
     result = 0;
 
  cleanup:
-    if (result < 0) {
-        g_strfreev(ret);
+    if (result < 0)
         nodeSize = -1;
-    } else {
-        *rwDisksPath = ret;
-    }
     VIR_FREE(nodes);
     return nodeSize;
 }
@@ -1277,7 +1266,7 @@ virVBoxSnapshotConfGetRODisksPathsFromLibvirtXML(const 
char *filePath,
 {
     int result = -1;
     size_t i = 0;
-    char **ret = NULL;
+    g_auto(GStrv) ret = NULL;
     g_autoptr(xmlDoc) xml = NULL;
     g_autoptr(xmlXPathContext) xPathContext = NULL;
     xmlNodePtr *nodes = NULL;
@@ -1313,15 +1302,12 @@ virVBoxSnapshotConfGetRODisksPathsFromLibvirtXML(const 
char *filePath,
         if (sourceNode)
             ret[i] = virXMLPropString(sourceNode, "file");
     }
+    *roDisksPath = g_steal_pointer(&ret);
     result = 0;
 
  cleanup:
-    if (result < 0) {
-        g_strfreev(ret);
+    if (result < 0)
         nodeSize = -1;
-    } else {
-        *roDisksPath = ret;
-    }
     VIR_FREE(nodes);
     return nodeSize;
 }
diff --git a/src/vbox/vbox_tmpl.c b/src/vbox/vbox_tmpl.c
index 1772a9b70e..7344882bbd 100644
--- a/src/vbox/vbox_tmpl.c
+++ b/src/vbox/vbox_tmpl.c
@@ -1548,7 +1548,7 @@ _vrdeServerGetPorts(struct _vboxDriver *data, IVRDEServer 
*VRDEServer,
     PRUnichar *VRDEPortsValue = NULL;
     PRInt32 port = -1;
     ssize_t nmatches = 0;
-    char **matches = NULL;
+    g_auto(GStrv) matches = NULL;
     char *portUtf8 = NULL;
 
     /* get active (effective) port - available only when VM is running and has
@@ -1596,7 +1596,6 @@ _vrdeServerGetPorts(struct _vboxDriver *data, IVRDEServer 
*VRDEServer,
     }
 
  cleanup:
-    g_strfreev(matches);
     VBOX_UTF8_FREE(portUtf8);
     VBOX_UTF16_FREE(VRDEPortsValue);
     VBOX_UTF16_FREE(VRDEPortsKey);
diff --git a/src/vz/vz_sdk.c b/src/vz/vz_sdk.c
index 2ba48134b0..1772f75c3e 100644
--- a/src/vz/vz_sdk.c
+++ b/src/vz/vz_sdk.c
@@ -705,7 +705,7 @@ prlsdkGetFSInfo(PRL_HANDLE prldisk,
 {
     char *buf = NULL;
     int ret = -1;
-    char **matches = NULL;
+    g_auto(GStrv) matches = NULL;
     virURI *uri = NULL;
 
     fs->type = VIR_DOMAIN_FS_TYPE_FILE;
@@ -767,7 +767,6 @@ prlsdkGetFSInfo(PRL_HANDLE prldisk,
 
  cleanup:
     VIR_FREE(buf);
-    g_strfreev(matches);
     return ret;
 }
 
diff --git a/tests/qemumonitorjsontest.c b/tests/qemumonitorjsontest.c
index e5ba39cd2f..25a91cdeb3 100644
--- a/tests/qemumonitorjsontest.c
+++ b/tests/qemumonitorjsontest.c
@@ -1003,7 +1003,7 @@ testQemuMonitorJSONGetDeviceAliases(const void *opaque)
     const testGenericData *data = opaque;
     virDomainXMLOption *xmlopt = data->xmlopt;
     int ret = -1;
-    char **aliases = NULL;
+    g_auto(GStrv) aliases = NULL;
     const char **alias;
     const char *expected[] = {
         "virtio-disk25", "video0", "serial0", "ide0-0-0", "usb", NULL };
@@ -1053,7 +1053,6 @@ testQemuMonitorJSONGetDeviceAliases(const void *opaque)
     }
 
  cleanup:
-    g_strfreev(aliases);
     return ret;
 }
 
diff --git a/tests/vboxsnapshotxmltest.c b/tests/vboxsnapshotxmltest.c
index da39561456..d69eb3fc24 100644
--- a/tests/vboxsnapshotxmltest.c
+++ b/tests/vboxsnapshotxmltest.c
@@ -19,7 +19,7 @@ static char *
 testFilterXML(char *xml)
 {
     g_auto(virBuffer) buf = VIR_BUFFER_INITIALIZER;
-    char **xmlLines = NULL;
+    g_auto(GStrv) xmlLines = NULL;
     char **xmlLine;
     char *ret = NULL;
 
@@ -39,7 +39,6 @@ testFilterXML(char *xml)
     ret = virBufferContentAndReset(&buf);
 
  cleanup:
-   g_strfreev(xmlLines);
    return ret;
 }
 
diff --git a/tests/virconftest.c b/tests/virconftest.c
index 5d1ad8a612..32d3d8849b 100644
--- a/tests/virconftest.c
+++ b/tests/virconftest.c
@@ -372,7 +372,7 @@ static int testConfParseStringList(const void *opaque 
G_GNUC_UNUSED)
 
     int ret = -1;
     g_autoptr(virConf) conf = virConfReadString(srcdata, 0);
-    char **str = NULL;
+    g_auto(GStrv) str = NULL;
 
     if (!conf)
         return -1;
@@ -423,7 +423,6 @@ static int testConfParseStringList(const void *opaque 
G_GNUC_UNUSED)
 
     ret = 0;
  cleanup:
-    g_strfreev(str);
     return ret;
 }
 
diff --git a/tests/virfiletest.c b/tests/virfiletest.c
index 1434d6b7ba..2fbece8f63 100644
--- a/tests/virfiletest.c
+++ b/tests/virfiletest.c
@@ -65,7 +65,7 @@ struct testFileGetMountSubtreeData {
 static int testFileGetMountSubtree(const void *opaque)
 {
     int ret = -1;
-    char **gotmounts = NULL;
+    g_auto(GStrv) gotmounts = NULL;
     size_t gotnmounts = 0;
     const struct testFileGetMountSubtreeData *data = opaque;
 
@@ -88,7 +88,6 @@ static int testFileGetMountSubtree(const void *opaque)
                               data->mounts, data->nmounts);
 
  cleanup:
-    g_strfreev(gotmounts);
     return ret;
 }
 #endif /* ! defined WITH_MNTENT_H && defined WITH_GETMNTENT_R */
diff --git a/tests/virstringtest.c b/tests/virstringtest.c
index 277deca934..77fcec5613 100644
--- a/tests/virstringtest.c
+++ b/tests/virstringtest.c
@@ -127,7 +127,7 @@ static int
 testStringSearch(const void *opaque)
 {
     const struct stringSearchData *data = opaque;
-    char **matches = NULL;
+    g_auto(GStrv) matches = NULL;
     ssize_t nmatches;
     int ret = -1;
 
@@ -174,7 +174,6 @@ testStringSearch(const void *opaque)
     ret = 0;
 
  cleanup:
-    g_strfreev(matches);
     return ret;
 }
 
diff --git a/tools/virsh-host.c b/tools/virsh-host.c
index 2a84c58be7..f6aa532b40 100644
--- a/tools/virsh-host.c
+++ b/tools/virsh-host.c
@@ -1059,7 +1059,7 @@ static char **
 vshExtractCPUDefXMLs(vshControl *ctl,
                      const char *xmlFile)
 {
-    char **cpus = NULL;
+    g_auto(GStrv) cpus = NULL;
     g_autofree char *buffer = NULL;
     g_autofree char *xmlStr = NULL;
     g_autoptr(xmlDoc) xml = NULL;
@@ -1126,7 +1126,6 @@ vshExtractCPUDefXMLs(vshControl *ctl,
     return cpus;
 
  error:
-    g_strfreev(cpus);
     goto cleanup;
 }
 
@@ -1163,7 +1162,7 @@ cmdCPUCompare(vshControl *ctl, const vshCmd *cmd)
     const char *from = NULL;
     bool ret = false;
     int result;
-    char **cpus = NULL;
+    g_auto(GStrv) cpus = NULL;
     unsigned int flags = 0;
     virshControl *priv = ctl->privData;
 
@@ -1207,8 +1206,6 @@ cmdCPUCompare(vshControl *ctl, const vshCmd *cmd)
     ret = true;
 
  cleanup:
-    g_strfreev(cpus);
-
     return ret;
 }
 
@@ -1585,7 +1582,7 @@ cmdHypervisorCPUCompare(vshControl *ctl,
     const char *machine = NULL;
     bool ret = false;
     int result;
-    char **cpus = NULL;
+    g_auto(GStrv) cpus = NULL;
     unsigned int flags = 0;
     virshControl *priv = ctl->privData;
 
@@ -1640,7 +1637,6 @@ cmdHypervisorCPUCompare(vshControl *ctl,
     ret = true;
 
  cleanup:
-    g_strfreev(cpus);
     return ret;
 }
 
@@ -1699,7 +1695,7 @@ cmdHypervisorCPUBaseline(vshControl *ctl,
     const char *machine = NULL;
     bool ret = false;
     g_autofree char *result = NULL;
-    char **list = NULL;
+    g_auto(GStrv) list = NULL;
     unsigned int flags = 0;
     virshControl *priv = ctl->privData;
 
@@ -1729,7 +1725,6 @@ cmdHypervisorCPUBaseline(vshControl *ctl,
         ret = true;
     }
 
-    g_strfreev(list);
     return ret;
 }
 
diff --git a/tools/virt-login-shell-helper.c b/tools/virt-login-shell-helper.c
index 5c6e007b09..0fb03da697 100644
--- a/tools/virt-login-shell-helper.c
+++ b/tools/virt-login-shell-helper.c
@@ -47,7 +47,8 @@ static int virLoginShellAllowedUser(virConf *conf,
     int ret = -1;
     size_t i;
     char *gname = NULL;
-    char **users = NULL, **entries;
+    g_auto(GStrv) users = NULL;
+    char **entries;
 
     if (virConfGetValueStringList(conf, "allowed_users", false, &users) < 0)
         goto cleanup;
@@ -84,7 +85,6 @@ static int virLoginShellAllowedUser(virConf *conf,
                          name, conf_file);
  cleanup:
     VIR_FREE(gname);
-    g_strfreev(users);
     return ret;
 }
 
@@ -157,7 +157,7 @@ main(int argc, char **argv)
     uid_t uid;
     gid_t gid;
     char *name = NULL;
-    char **shargv = NULL;
+    g_auto(GStrv) shargv = NULL;
     size_t shargvlen = 0;
     char *shcmd = NULL;
     virSecurityModelPtr secmodel = NULL;
@@ -403,7 +403,6 @@ main(int argc, char **argv)
         virDomainFree(dom);
     if (conn)
         virConnectClose(conn);
-    g_strfreev(shargv);
     VIR_FREE(shcmd);
     VIR_FREE(term);
     VIR_FREE(name);
diff --git a/tools/vsh.c b/tools/vsh.c
index ecb591fb63..e3e27a0ba6 100644
--- a/tools/vsh.c
+++ b/tools/vsh.c
@@ -3365,7 +3365,8 @@ cmdComplete(vshControl *ctl, const vshCmd *cmd)
     int stdin_fileno = STDIN_FILENO;
     const char *arg = "";
     const vshCmdOpt *opt = NULL;
-    char **matches = NULL, **iter;
+    g_auto(GStrv) matches = NULL;
+    char **iter;
     g_auto(virBuffer) buf = VIR_BUFFER_INITIALIZER;
 
     if (vshCommandOptStringQuiet(ctl, cmd, "string", &arg) <= 0)
@@ -3406,7 +3407,6 @@ cmdComplete(vshControl *ctl, const vshCmd *cmd)
 
     ret = true;
  cleanup:
-    g_strfreev(matches);
     return ret;
 }
 
-- 
2.32.0

Reply via email to