From nobody Sat Feb 7 09:29:30 2026 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of redhat.com designates 170.10.133.124 as permitted sender) client-ip=170.10.133.124; envelope-from=libvir-list-bounces@redhat.com; helo=us-smtp-delivery-124.mimecast.com; Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of redhat.com designates 170.10.133.124 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com; dmarc=pass(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1635776203; cv=none; d=zohomail.com; s=zohoarc; b=JzbdYGh/xdw3febRSDAvFIkpa51NmKajyPLU/cZJsgJPZdNG/XfnkojK1pUusSjmdmPG43nmLHCjUCTRZJiBpuK7TXGLDj8QQnIMRcAd/2PqCmy9IKz3pxRFkCNUcPCO3Yz4U6BfQqYGWAZ3WG/MCMgTin0GqbahjvZCIcxHhzc= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1635776203; h=Content-Type:Content-Transfer-Encoding:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=flfIuzHG1hA4gPIOOiYO4UrIHahpHHhM2K7YAQhsI1Q=; b=jld3s3EfbL8KnOtb+jZ+eB+7rDQf4/CclXeiNf1LUxsr8x0UzuJimnqF4nYxmyDmObcVTneFAO/14umJcufwMwF650DIbcl8Ow/vkuhes4TlRDpF/wy5U38CuUv3n+J3oMaXitJTfAny4jlJltzUXJzZ5/T+EgKGV2v8YQMPBlQ= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of redhat.com designates 170.10.133.124 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.133.124]) by mx.zohomail.com with SMTPS id 1635776203739237.86893581696063; Mon, 1 Nov 2021 07:16:43 -0700 (PDT) Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-410-EV5uUUbNNBS2NVg9zwzzqA-1; Mon, 01 Nov 2021 10:16:39 -0400 Received: from smtp.corp.redhat.com (int-mx06.intmail.prod.int.phx2.redhat.com [10.5.11.16]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id C5966802B61; Mon, 1 Nov 2021 14:16:33 +0000 (UTC) Received: from colo-mx.corp.redhat.com (colo-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.20]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 7C0F85C1CF; Mon, 1 Nov 2021 14:16:33 +0000 (UTC) Received: from lists01.pubmisc.prod.ext.phx2.redhat.com (lists01.pubmisc.prod.ext.phx2.redhat.com [10.5.19.33]) by colo-mx.corp.redhat.com (Postfix) with ESMTP id 448861806D04; Mon, 1 Nov 2021 14:16:32 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.12]) by lists01.pubmisc.prod.ext.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id 1A1EGUO9023072 for ; Mon, 1 Nov 2021 10:16:30 -0400 Received: by smtp.corp.redhat.com (Postfix) id 21D3360C17; Mon, 1 Nov 2021 14:16:30 +0000 (UTC) Received: from maggie.redhat.com (unknown [10.43.2.27]) by smtp.corp.redhat.com (Postfix) with ESMTP id 50B7B60C0F for ; Mon, 1 Nov 2021 14:16:29 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1635776202; h=from:from:sender:sender:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:mime-version:mime-version: content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references:list-id:list-help: list-unsubscribe:list-subscribe:list-post; bh=flfIuzHG1hA4gPIOOiYO4UrIHahpHHhM2K7YAQhsI1Q=; b=K8Ov3o1/meEBoEa15DG6yf2vjb/n26QAdeID9bTNpai+PmQvI8udICBSywYPc/R0+FO0pj 9s3D8y61JlmW/RRntJlh0L1iVK/S324x59+MzxC12ABDi9aspZ05JPirZnAr8yGrg3mc++ ps9Tgg5OisqLlzqxk+nIdWAJAEorpkY= X-MC-Unique: EV5uUUbNNBS2NVg9zwzzqA-1 From: Michal Privoznik To: libvir-list@redhat.com Subject: [PATCH 2/7] Prefer g_auto(GStrv) over g_strfreev() Date: Mon, 1 Nov 2021 15:16:14 +0100 Message-Id: <5383632e85ef2c8208eca3dc23900f62c83548a2.1635776103.git.mprivozn@redhat.com> In-Reply-To: References: MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.12 X-loop: libvir-list@redhat.com X-BeenThere: libvir-list@redhat.com X-Mailman-Version: 2.1.12 Precedence: junk List-Id: Development discussions about the libvirt library & tools List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: libvir-list-bounces@redhat.com Errors-To: libvir-list-bounces@redhat.com X-Scanned-By: MIMEDefang 2.79 on 10.5.11.16 Authentication-Results: relay.mimecast.com; auth=pass smtp.auth=CUSA124A263 smtp.mailfrom=libvir-list-bounces@redhat.com X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Transfer-Encoding: quoted-printable X-ZohoMail-DKIM: pass (identity @redhat.com) X-ZM-MESSAGEID: 1635776204608100004 Content-Type: text/plain; charset="utf-8" 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 --- 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 *dri= ver G_GNUC_UNUSED, static void virAppendBootloaderArgs(virCommand *cmd, virDomainDef *def) { - char **blargs; + g_auto(GStrv) blargs =3D NULL; =20 /* XXX: Handle quoted? */ blargs =3D g_strsplit(def->os.bootloaderArgs, " ", 0); virCommandAddArgSet(cmd, (const char * const *)blargs); - g_strfreev(blargs); } =20 static virCommand * diff --git a/src/bhyve/bhyve_parse_command.c b/src/bhyve/bhyve_parse_comman= d.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 =3D NULL; + g_auto(GStrv) lines =3D NULL; size_t i; size_t line_count =3D 0; size_t lines_alloc =3D 0; @@ -168,7 +168,7 @@ bhyveCommandLineToArgv(const char *nativeConfig, =20 for (i =3D 0; i < line_count; i++) { size_t j; - char **arglist =3D NULL; + g_auto(GStrv) arglist =3D NULL; size_t args_count =3D 0; size_t args_alloc =3D 0; =20 @@ -223,23 +223,17 @@ bhyveCommandLineToArgv(const char *nativeConfig, if (!bhyve_argc) goto error; for (j =3D 0; j < args_count; j++) - _bhyve_argv[j] =3D arglist[j]; + _bhyve_argv[j] =3D g_steal_pointer(&arglist[j]); _bhyve_argv[j] =3D NULL; *bhyve_argc =3D 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 =3D 0; j < args_count; j++) - _loader_argv[j] =3D arglist[j]; + _loader_argv[j] =3D g_steal_pointer(&arglist[j]); _loader_argv[j] =3D NULL; *loader_argc =3D args_count-1; - VIR_FREE(arglist); - } else { - /* To prevent a use-after-free here, only free the argument li= st - * when it is definitely not going to be used */ - g_strfreev(arglist); } } =20 @@ -247,13 +241,11 @@ bhyveCommandLineToArgv(const char *nativeConfig, if (!(*bhyve_argv =3D _bhyve_argv)) goto error; =20 - g_strfreev(lines); return 0; =20 error: VIR_FREE(_loader_argv); VIR_FREE(_bhyve_argv); - g_strfreev(lines); return -1; } =20 @@ -944,9 +936,9 @@ bhyveParseCommandLineString(const char* nativeConfig, { virDomainDef *def =3D NULL; int bhyve_argc =3D 0; - char **bhyve_argv =3D NULL; + g_auto(GStrv) bhyve_argv =3D NULL; int loader_argc =3D 0; - char **loader_argv =3D NULL; + g_auto(GStrv) loader_argv =3D NULL; =20 if (!(def =3D virDomainDefNew(xmlopt))) goto cleanup; @@ -982,8 +974,6 @@ bhyveParseCommandLineString(const char* nativeConfig, } =20 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 =3D NULL; - char **mem_tokens =3D NULL; + g_auto(GStrv) cmd_tokens =3D NULL; size_t i; size_t j; libxl_physinfo physinfo; @@ -1899,6 +1898,8 @@ libxlDriverGetDom0MaxmemConf(libxlDriverConfig *cfg, goto physmem; =20 for (i =3D 0; cmd_tokens[i] !=3D NULL; i++) { + g_auto(GStrv) mem_tokens =3D NULL; + if (!STRPREFIX(cmd_tokens[i], "dom0_mem=3D")) continue; =20 @@ -1934,8 +1935,6 @@ libxlDriverGetDom0MaxmemConf(libxlDriverConfig *cfg, goto cleanup; } } - g_strfreev(mem_tokens); - mem_tokens =3D NULL; } =20 physmem: @@ -1950,8 +1949,6 @@ libxlDriverGetDom0MaxmemConf(libxlDriverConfig *cfg, ret =3D 0; =20 cleanup: - g_strfreev(cmd_tokens); - g_strfreev(mem_tokens); return ret; } =20 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 *b= ridge) /* 'bridge' string contains a bridge name and one or more vlan tru= nks */ size_t i; size_t nvlans =3D 0; - char **vlanstr_list =3D g_strsplit(bridge, ":", 0); + g_auto(GStrv) vlanstr_list =3D g_strsplit(bridge, ":", 0); =20 if (!vlanstr_list) return -1; @@ -1058,15 +1058,13 @@ xenParseVifBridge(virDomainNetDef *net, const char = *bridge) net->vlan.tag =3D g_new0(unsigned int, nvlans); =20 for (i =3D 1; i <=3D 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] =3D tag; } net->vlan.nTags =3D nvlans; net->vlan.trunk =3D true; - g_strfreev(vlanstr_list); =20 net->virtPortProfile =3D g_new0(virNetDevVPortProfile, 1); net->virtPortProfile->virtPortType =3D VIR_NETDEV_VPORT_PROFILE_OP= ENVSWITCH; @@ -1201,19 +1199,16 @@ xenParseVif(char *entry, const char *vif_typename) goto cleanup; } if (ip) { - char **ip_list =3D g_strsplit(ip, " ", 0); + g_auto(GStrv) ip_list =3D g_strsplit(ip, " ", 0); size_t i; =20 if (!ip_list) goto cleanup; =20 for (i =3D 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); } =20 if (script && script[0]) @@ -1579,7 +1574,7 @@ char * xenMakeIPList(virNetDevIPInfo *guestIP) { size_t i; - char **address_array; + g_auto(GStrv) address_array =3D NULL; char *ret =3D NULL; =20 address_array =3D g_new0(char *, guestIP->nips + 1); @@ -1592,7 +1587,6 @@ xenMakeIPList(virNetDevIPInfo *guestIP) ret =3D g_strjoinv(" ", address_array); =20 cleanup: - g_strfreev(address_array); return ret; } =20 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 =3D NULL; - char **cpuid_pairs =3D NULL; - char **name_and_value =3D NULL; + g_auto(GStrv) cpuid_pairs =3D NULL; size_t i; int ret =3D -1; int policy; @@ -283,7 +282,7 @@ xenParseXLCPUID(virConf *conf, virDomainDef *def) } =20 for (i =3D 1; cpuid_pairs[i]; i++) { - name_and_value =3D g_strsplit(cpuid_pairs[i], "=3D", 2); + g_auto(GStrv) name_and_value =3D g_strsplit(cpuid_pairs[i], "=3D",= 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 =3D NULL; } =20 ret =3D 0; =20 cleanup: - g_strfreev(name_and_value); - g_strfreev(cpuid_pairs); return ret; } =20 @@ -406,7 +400,6 @@ xenParseXLVnuma(virConf *conf, { int ret =3D -1; char *tmp =3D NULL; - char **token =3D NULL; size_t vcpus =3D 0; size_t nr_nodes =3D 0; size_t vnodeCnt =3D 0; @@ -506,6 +499,7 @@ xenParseXLVnuma(virConf *conf, vcpus +=3D virBitmapCountBits(cpumask); =20 } else if (STRPREFIX(str, "vdistances")) { + g_auto(GStrv) token =3D NULL; size_t i, ndistances; unsigned int value; =20 @@ -519,7 +513,6 @@ xenParseXLVnuma(virConf *conf, VIR_FREE(tmp); tmp =3D g_strdup(vtoken); =20 - g_strfreev(token); if (!(token =3D g_strsplit(tmp, ",", 0))) goto cleanup; =20 @@ -583,7 +576,6 @@ xenParseXLVnuma(virConf *conf, cleanup: if (ret) VIR_FREE(cpu); - g_strfreev(token); VIR_FREE(tmp); =20 return ret; @@ -1301,7 +1293,7 @@ xenFormatXLOS(virConf *conf, virDomainDef *def) static int xenFormatXLCPUID(virConf *conf, virDomainDef *def) { - char **cpuid_pairs =3D NULL; + g_auto(GStrv) cpuid_pairs =3D NULL; g_autofree char *cpuid_string =3D NULL; size_t i, j; int ret =3D -1; @@ -1359,7 +1351,6 @@ xenFormatXLCPUID(virConf *conf, virDomainDef *def) ret =3D 0; =20 cleanup: - g_strfreev(cpuid_pairs); return ret; } =20 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 =3D NULL; + g_auto(GStrv) mounts =3D NULL; size_t nmounts =3D 0; size_t i; int saveErrno; @@ -555,8 +555,6 @@ static int lxcContainerUnmountSubtree(const char *prefi= x, ret =3D 0; =20 cleanup: - g_strfreev(mounts); - return ret; } =20 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 =3D NULL; size_t i; size_t ntokens =3D 0; - char **parts; - char **result =3D NULL; + g_auto(GStrv) parts =3D NULL; + g_auto(GStrv) result =3D NULL; =20 tmp =3D g_strdup(string); =20 @@ -132,12 +132,9 @@ static char ** lxcStringSplit(const char *string) result[ntokens - 2] =3D g_strdup(parts[i]); } =20 - g_strfreev(parts); - return result; + return g_steal_pointer(&result); =20 error: - g_strfreev(parts); - g_strfreev(result); return NULL; } =20 @@ -145,7 +142,7 @@ static lxcFstab * lxcParseFstabLine(char *fstabLine) { lxcFstab *fstab =3D NULL; - char **parts; + g_auto(GStrv) parts =3D NULL; =20 if (!fstabLine) return NULL; @@ -162,13 +159,10 @@ lxcParseFstabLine(char *fstabLine) fstab->type =3D g_strdup(parts[2]); fstab->options =3D g_strdup(parts[3]); =20 - g_strfreev(parts); - return fstab; =20 error: lxcFstabFree(fstab); - g_strfreev(parts); return NULL; } =20 @@ -252,7 +246,7 @@ lxcAddFstabLine(virDomainDef *def, lxcFstab *fstab) { const char *src =3D NULL; g_autofree char *dst =3D NULL; - char **options =3D g_strsplit(fstab->options, ",", 0); + g_auto(GStrv) options =3D g_strsplit(fstab->options, ",", 0); bool readonly; int type =3D VIR_DOMAIN_FS_TYPE_MOUNT; unsigned long long usage =3D 0; @@ -307,7 +301,6 @@ lxcAddFstabLine(virDomainDef *def, lxcFstab *fstab) ret =3D 1; =20 cleanup: - g_strfreev(options); return ret; } =20 @@ -967,7 +960,7 @@ lxcSetCpusetTune(virDomainDef *def, virConf *properties) static int lxcBlkioDeviceWalkCallback(const char *name, virConfValue *value, void *da= ta) { - char **parts =3D NULL; + g_auto(GStrv) parts =3D NULL; virBlkioDevice *device =3D NULL; virDomainDef *def =3D data; size_t i =3D 0; @@ -1044,7 +1037,6 @@ lxcBlkioDeviceWalkCallback(const char *name, virConfV= alue *value, void *data) ret =3D 0; =20 cleanup: - g_strfreev(parts); return ret; } =20 @@ -1072,7 +1064,7 @@ static void lxcSetCapDrop(virDomainDef *def, virConf *properties) { g_autofree char *value =3D NULL; - char **toDrop =3D NULL; + g_auto(GStrv) toDrop =3D NULL; const char *capString; size_t i; =20 @@ -1087,8 +1079,6 @@ lxcSetCapDrop(virDomainDef *def, virConf *properties) } =20 def->features[VIR_DOMAIN_FEATURE_CAPABILITIES] =3D VIR_DOMAIN_CAPABILI= TIES_POLICY_ALLOW; - - g_strfreev(toDrop); } =20 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 =3D NULL; g_autofree char *data =3D NULL; - char **lines =3D NULL; + g_auto(GStrv) lines =3D NULL; size_t i; int ret =3D -1; double val; @@ -1392,7 +1392,6 @@ qemuGetSchedInfo(unsigned long long *cpuWait, ret =3D 0; =20 cleanup: - g_strfreev(lines); return ret; } =20 @@ -12517,7 +12516,7 @@ qemuConnectBaselineHypervisorCPU(virConnectPtr conn, bool migratable; virCPUDef *cpu =3D NULL; char *cpustr =3D NULL; - char **features =3D NULL; + g_auto(GStrv) features =3D NULL; =20 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); =20 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 *s= erver G_GNUC_UNUSED, remote_connect_get_cpu_model_names_r= et *ret) { int len, rv =3D -1; - char **models =3D NULL; + g_auto(GStrv) models =3D NULL; virConnectPtr conn =3D remoteGetHypervisorConn(client); =20 if (!conn) @@ -5858,7 +5858,6 @@ remoteDispatchConnectGetCPUModelNames(virNetServer *s= erver G_GNUC_UNUSED, cleanup: if (rv < 0) virNetMessageSaveError(rerr); - g_strfreev(models); return rv; } =20 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 =3D -1; size_t i; - char **retmodels =3D NULL; + g_auto(GStrv) retmodels =3D NULL; remote_connect_get_cpu_model_names_args args; remote_connect_get_cpu_model_names_ret ret; =20 @@ -6307,8 +6307,6 @@ remoteConnectGetCPUModelNames(virConnectPtr conn, rv =3D ret.ret; =20 cleanup: - g_strfreev(retmodels); - xdr_free((xdrproc_t) xdr_remote_connect_get_cpu_model_names_ret, (char= *) &ret); =20 done: diff --git a/src/storage/storage_backend_rbd.c b/src/storage/storage_backen= d_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 =3D NULL; struct rados_cluster_stat_t clusterstat; struct rados_pool_stat_t poolstat; - char **names =3D NULL; + g_auto(GStrv) names =3D NULL; size_t i; =20 if (!(ptr =3D virStorageBackendRBDNewState(pool))) @@ -724,7 +724,6 @@ virStorageBackendRBDRefreshPool(virStoragePoolObj *pool) ret =3D 0; =20 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 =3D NULL; size_t i; int ret =3D -1; =20 @@ -887,7 +887,6 @@ virCgroupSetPartitionSuffix(const char *path, char **re= s) ret =3D 0; =20 cleanup: - g_strfreev(tokens); return ret; } =20 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 =3D NULL; g_autofree char *contFile =3D NULL; - char **contList =3D NULL; + g_auto(GStrv) contList =3D NULL; char **tmp; =20 if (parent) { @@ -300,8 +300,6 @@ virCgroupV2ParseControllersFile(virCgroup *group, tmp++; } =20 - g_strfreev(contList); - return 0; } =20 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 =3D -1; - char **token; + g_auto(GStrv) token =3D NULL; =20 if (!(token =3D g_strsplit(str, ":", 0))) goto cleanup; @@ -84,7 +84,6 @@ virFirmwareParse(const char *str, virFirmware *firmware) =20 ret =3D 0; cleanup: - g_strfreev(token); return ret; } =20 @@ -95,7 +94,7 @@ virFirmwareParseList(const char *list, size_t *nfirmwares) { int ret =3D -1; - char **token; + g_auto(GStrv) token =3D NULL; size_t i, j; =20 if (!(token =3D g_strsplit(list, ":", 0))) @@ -126,6 +125,5 @@ virFirmwareParseList(const char *list, =20 ret =3D 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 =3D -1; - char **aliases =3D NULL; + g_auto(GStrv) aliases =3D NULL; =20 *uri =3D NULL; =20 @@ -358,7 +358,6 @@ virURIResolveAlias(virConf *conf, const char *alias, ch= ar **uri) =20 if (aliases && *aliases) { ret =3D virURIFindAliasMatch(aliases, alias, uri); - g_strfreev(aliases); } else { ret =3D 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 =3D NULL; PRUnichar *machineNameUtf16 =3D NULL; char *machineName =3D NULL; - char **realReadWriteDisksPath =3D NULL; + g_auto(GStrv) realReadWriteDisksPath =3D NULL; int realReadWriteDisksPathSize =3D 0; - char **realReadOnlyDisksPath =3D NULL; + g_auto(GStrv) realReadOnlyDisksPath =3D NULL; int realReadOnlyDisksPathSize =3D 0; virVBoxSnapshotConfSnapshot *newSnapshotPtr =3D NULL; unsigned char snapshotUuid[VIR_UUID_BUFLEN]; virVBoxSnapshotConfHardDisk **hardDiskToOpen =3D NULL; size_t hardDiskToOpenSize =3D 0; virVBoxSnapshotConfHardDisk *newHardDisk =3D NULL; - char **searchResultTab =3D NULL; + g_auto(GStrv) searchResultTab =3D NULL; ssize_t resultSize =3D 0; int it =3D 0; int jt =3D 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(virDomainSnapsho= tPtr snapshot) char *settingsFilepath =3D NULL; virVBoxSnapshotConfMachine *snapshotMachineDesc =3D NULL; int isCurrent =3D -1; - char **searchResultTab =3D NULL; + g_auto(GStrv) searchResultTab =3D NULL; ssize_t resultSize =3D 0; int it =3D 0; PRUnichar *machineNameUtf16 =3D NULL; @@ -7195,7 +7192,6 @@ vboxDomainSnapshotDeleteMetadataOnly(virDomainSnapsho= tPtr 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(xmlN= odePtr diskNode, virVBoxSnapshotConfHardDisk *hardDisk =3D NULL; xmlNodePtr *nodes =3D NULL; char *uuid =3D NULL; - char **searchTabResult =3D NULL; + g_auto(GStrv) searchTabResult =3D NULL; int resultSize =3D 0; size_t i =3D 0; int result =3D -1; @@ -103,7 +103,6 @@ virVBoxSnapshotConfCreateVBoxSnapshotConfHardDiskPtr(xm= lNodePtr diskNode, VIR_FREE(nodes); VIR_FREE(location); VIR_FREE(tmp); - g_strfreev(searchTabResult); if (result < 0) { virVboxSnapshotConfHardDiskFree(hardDisk); hardDisk =3D NULL; @@ -184,7 +183,7 @@ virVBoxSnapshotConfRetrieveSnapshot(xmlNodePtr snapshot= Node, xmlNodePtr snapshotsNode =3D NULL; xmlNodePtr *nodes =3D NULL; char *uuid =3D NULL; - char **searchTabResult =3D NULL; + g_auto(GStrv) searchTabResult =3D NULL; int resultSize =3D 0; size_t i =3D 0; int result =3D -1; @@ -270,7 +269,6 @@ virVBoxSnapshotConfRetrieveSnapshot(xmlNodePtr snapshot= Node, } VIR_FREE(nodes); VIR_FREE(uuid); - g_strfreev(searchTabResult); return snapshot; } =20 @@ -371,9 +369,9 @@ virVBoxSnapshotConfSerializeSnapshot(xmlNodePtr node, char *uuid =3D NULL; char *timeStamp =3D NULL; =20 - char **firstRegex =3D NULL; + g_auto(GStrv) firstRegex =3D NULL; int firstRegexResult =3D 0; - char **secondRegex =3D NULL; + g_auto(GStrv) secondRegex =3D NULL; int secondRegexResult =3D 0; =20 uuid =3D 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 =3D NULL; char *currentStateModifiedString =3D NULL; =20 - char **searchResultTab =3D NULL; + g_auto(GStrv) searchResultTab =3D NULL; ssize_t searchResultSize =3D 0; char *currentSnapshotAttribute =3D NULL; =20 @@ -719,7 +715,6 @@ virVBoxSnapshotConfLoadVboxFile(const char *filePath, =20 VIR_FREE(currentStateModifiedString); VIR_FREE(currentSnapshotAttribute); - g_strfreev(searchResultTab); if (ret < 0) { virVBoxSnapshotConfMachineFree(machineDescription); machineDescription =3D NULL; @@ -963,9 +958,9 @@ virVBoxSnapshotConfSaveVboxFile(virVBoxSnapshotConfMach= ine *machine, char *currentSnapshot =3D NULL; char *timeStamp =3D NULL; =20 - char **firstRegex =3D NULL; + g_auto(GStrv) firstRegex =3D NULL; int firstRegexResult =3D 0; - char **secondRegex =3D NULL; + g_auto(GStrv) secondRegex =3D NULL; int secondRegexResult =3D 0; =20 if (machine =3D=3D NULL) { @@ -1171,9 +1166,6 @@ virVBoxSnapshotConfSaveVboxFile(virVBoxSnapshotConfMa= chine *machine, xmlUnlinkNode(machineNode); xmlFreeNode(machineNode); =20 - - g_strfreev(firstRegex); - g_strfreev(secondRegex); return ret; } =20 @@ -1216,7 +1208,7 @@ virVBoxSnapshotConfGetRWDisksPathsFromLibvirtXML(cons= t char *filePath, { int result =3D -1; size_t i =3D 0; - char **ret =3D NULL; + g_auto(GStrv) ret =3D NULL; g_autoptr(xmlDoc) xml =3D NULL; g_autoptr(xmlXPathContext) xPathContext =3D NULL; xmlNodePtr *nodes =3D NULL; @@ -1253,15 +1245,12 @@ virVBoxSnapshotConfGetRWDisksPathsFromLibvirtXML(co= nst char *filePath, if (sourceNode) ret[i] =3D virXMLPropString(sourceNode, "file"); } + *rwDisksPath =3D g_steal_pointer(&ret); result =3D 0; =20 cleanup: - if (result < 0) { - g_strfreev(ret); + if (result < 0) nodeSize =3D -1; - } else { - *rwDisksPath =3D ret; - } VIR_FREE(nodes); return nodeSize; } @@ -1277,7 +1266,7 @@ virVBoxSnapshotConfGetRODisksPathsFromLibvirtXML(cons= t char *filePath, { int result =3D -1; size_t i =3D 0; - char **ret =3D NULL; + g_auto(GStrv) ret =3D NULL; g_autoptr(xmlDoc) xml =3D NULL; g_autoptr(xmlXPathContext) xPathContext =3D NULL; xmlNodePtr *nodes =3D NULL; @@ -1313,15 +1302,12 @@ virVBoxSnapshotConfGetRODisksPathsFromLibvirtXML(co= nst char *filePath, if (sourceNode) ret[i] =3D virXMLPropString(sourceNode, "file"); } + *roDisksPath =3D g_steal_pointer(&ret); result =3D 0; =20 cleanup: - if (result < 0) { - g_strfreev(ret); + if (result < 0) nodeSize =3D -1; - } else { - *roDisksPath =3D 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, IVRDESe= rver *VRDEServer, PRUnichar *VRDEPortsValue =3D NULL; PRInt32 port =3D -1; ssize_t nmatches =3D 0; - char **matches =3D NULL; + g_auto(GStrv) matches =3D NULL; char *portUtf8 =3D NULL; =20 /* get active (effective) port - available only when VM is running and= has @@ -1596,7 +1596,6 @@ _vrdeServerGetPorts(struct _vboxDriver *data, IVRDESe= rver *VRDEServer, } =20 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 =3D NULL; int ret =3D -1; - char **matches =3D NULL; + g_auto(GStrv) matches =3D NULL; virURI *uri =3D NULL; =20 fs->type =3D VIR_DOMAIN_FS_TYPE_FILE; @@ -767,7 +767,6 @@ prlsdkGetFSInfo(PRL_HANDLE prldisk, =20 cleanup: VIR_FREE(buf); - g_strfreev(matches); return ret; } =20 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 *opaqu= e) const testGenericData *data =3D opaque; virDomainXMLOption *xmlopt =3D data->xmlopt; int ret =3D -1; - char **aliases =3D NULL; + g_auto(GStrv) aliases =3D NULL; const char **alias; const char *expected[] =3D { "virtio-disk25", "video0", "serial0", "ide0-0-0", "usb", NULL }; @@ -1053,7 +1053,6 @@ testQemuMonitorJSONGetDeviceAliases(const void *opaqu= e) } =20 cleanup: - g_strfreev(aliases); return ret; } =20 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 =3D VIR_BUFFER_INITIALIZER; - char **xmlLines =3D NULL; + g_auto(GStrv) xmlLines =3D NULL; char **xmlLine; char *ret =3D NULL; =20 @@ -39,7 +39,6 @@ testFilterXML(char *xml) ret =3D virBufferContentAndReset(&buf); =20 cleanup: - g_strfreev(xmlLines); return ret; } =20 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) =20 int ret =3D -1; g_autoptr(virConf) conf =3D virConfReadString(srcdata, 0); - char **str =3D NULL; + g_auto(GStrv) str =3D NULL; =20 if (!conf) return -1; @@ -423,7 +423,6 @@ static int testConfParseStringList(const void *opaque G= _GNUC_UNUSED) =20 ret =3D 0; cleanup: - g_strfreev(str); return ret; } =20 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 =3D -1; - char **gotmounts =3D NULL; + g_auto(GStrv) gotmounts =3D NULL; size_t gotnmounts =3D 0; const struct testFileGetMountSubtreeData *data =3D opaque; =20 @@ -88,7 +88,6 @@ static int testFileGetMountSubtree(const void *opaque) data->mounts, data->nmounts); =20 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 =3D opaque; - char **matches =3D NULL; + g_auto(GStrv) matches =3D NULL; ssize_t nmatches; int ret =3D -1; =20 @@ -174,7 +174,6 @@ testStringSearch(const void *opaque) ret =3D 0; =20 cleanup: - g_strfreev(matches); return ret; } =20 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 =3D NULL; + g_auto(GStrv) cpus =3D NULL; g_autofree char *buffer =3D NULL; g_autofree char *xmlStr =3D NULL; g_autoptr(xmlDoc) xml =3D NULL; @@ -1126,7 +1126,6 @@ vshExtractCPUDefXMLs(vshControl *ctl, return cpus; =20 error: - g_strfreev(cpus); goto cleanup; } =20 @@ -1163,7 +1162,7 @@ cmdCPUCompare(vshControl *ctl, const vshCmd *cmd) const char *from =3D NULL; bool ret =3D false; int result; - char **cpus =3D NULL; + g_auto(GStrv) cpus =3D NULL; unsigned int flags =3D 0; virshControl *priv =3D ctl->privData; =20 @@ -1207,8 +1206,6 @@ cmdCPUCompare(vshControl *ctl, const vshCmd *cmd) ret =3D true; =20 cleanup: - g_strfreev(cpus); - return ret; } =20 @@ -1585,7 +1582,7 @@ cmdHypervisorCPUCompare(vshControl *ctl, const char *machine =3D NULL; bool ret =3D false; int result; - char **cpus =3D NULL; + g_auto(GStrv) cpus =3D NULL; unsigned int flags =3D 0; virshControl *priv =3D ctl->privData; =20 @@ -1640,7 +1637,6 @@ cmdHypervisorCPUCompare(vshControl *ctl, ret =3D true; =20 cleanup: - g_strfreev(cpus); return ret; } =20 @@ -1699,7 +1695,7 @@ cmdHypervisorCPUBaseline(vshControl *ctl, const char *machine =3D NULL; bool ret =3D false; g_autofree char *result =3D NULL; - char **list =3D NULL; + g_auto(GStrv) list =3D NULL; unsigned int flags =3D 0; virshControl *priv =3D ctl->privData; =20 @@ -1729,7 +1725,6 @@ cmdHypervisorCPUBaseline(vshControl *ctl, ret =3D true; } =20 - g_strfreev(list); return ret; } =20 diff --git a/tools/virt-login-shell-helper.c b/tools/virt-login-shell-helpe= r.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 =3D -1; size_t i; char *gname =3D NULL; - char **users =3D NULL, **entries; + g_auto(GStrv) users =3D NULL; + char **entries; =20 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; } =20 @@ -157,7 +157,7 @@ main(int argc, char **argv) uid_t uid; gid_t gid; char *name =3D NULL; - char **shargv =3D NULL; + g_auto(GStrv) shargv =3D NULL; size_t shargvlen =3D 0; char *shcmd =3D NULL; virSecurityModelPtr secmodel =3D 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 =3D STDIN_FILENO; const char *arg =3D ""; const vshCmdOpt *opt =3D NULL; - char **matches =3D NULL, **iter; + g_auto(GStrv) matches =3D NULL; + char **iter; g_auto(virBuffer) buf =3D VIR_BUFFER_INITIALIZER; =20 if (vshCommandOptStringQuiet(ctl, cmd, "string", &arg) <=3D 0) @@ -3406,7 +3407,6 @@ cmdComplete(vshControl *ctl, const vshCmd *cmd) =20 ret =3D true; cleanup: - g_strfreev(matches); return ret; } =20 --=20 2.32.0