Some variables are used in a loop and only freed in the cleanup section because we need to be able to jump out of the loop. Reduce their scope and free them automatically. Signed-off-by: Ján Tomko <jtomko@xxxxxxxxxx> --- tools/virsh-domain-monitor.c | 39 +++++++++++++----------------------- tools/virsh-domain.c | 34 +++++++++---------------------- 2 files changed, 23 insertions(+), 50 deletions(-) diff --git a/tools/virsh-domain-monitor.c b/tools/virsh-domain-monitor.c index 4059acc7d6..b07959b1ee 100644 --- a/tools/virsh-domain-monitor.c +++ b/tools/virsh-domain-monitor.c @@ -598,10 +598,6 @@ cmdDomblklist(vshControl *ctl, const vshCmd *cmd) xmlNodePtr *disks = NULL; size_t i; bool details = false; - char *type = NULL; - char *device = NULL; - char *target = NULL; - char *source = NULL; g_autoptr(vshTable) table = NULL; if (vshCommandOptBool(cmd, "inactive")) @@ -625,6 +621,11 @@ cmdDomblklist(vshControl *ctl, const vshCmd *cmd) goto cleanup; for (i = 0; i < ndisks; i++) { + g_autofree char *type = NULL; + g_autofree char *device = NULL; + g_autofree char *target = NULL; + g_autofree char *source = NULL; + ctxt->node = disks[i]; type = virXPathString("string(./@type)", ctxt); @@ -674,11 +675,6 @@ cmdDomblklist(vshControl *ctl, const vshCmd *cmd) NULLSTR_MINUS(source), NULL) < 0) goto cleanup; } - - VIR_FREE(source); - VIR_FREE(target); - VIR_FREE(device); - VIR_FREE(type); } vshTablePrintToStdout(table, ctl); @@ -686,10 +682,6 @@ cmdDomblklist(vshControl *ctl, const vshCmd *cmd) ret = true; cleanup: - VIR_FREE(source); - VIR_FREE(target); - VIR_FREE(device); - VIR_FREE(type); VIR_FREE(disks); return ret; } @@ -999,7 +991,6 @@ cmdDomblkstat(vshControl *ctl, const vshCmd *cmd) virDomainBlockStatsStruct stats; virTypedParameterPtr params = NULL; virTypedParameterPtr par = NULL; - char *value = NULL; const char *field = NULL; int rc, nparams = 0; size_t i; @@ -1065,6 +1056,8 @@ cmdDomblkstat(vshControl *ctl, const vshCmd *cmd) /* at first print all known values in desired order */ for (i = 0; domblkstat_output[i].field != NULL; i++) { + g_autofree char *value = NULL; + if (!(par = virTypedParamsGet(params, nparams, domblkstat_output[i].field))) continue; @@ -1087,18 +1080,17 @@ cmdDomblkstat(vshControl *ctl, const vshCmd *cmd) vshPrint(ctl, "%s %-*s %s\n", device, human ? 31 : 0, field, value); - - VIR_FREE(value); } /* go through the fields again, for remaining fields */ for (i = 0; i < nparams; i++) { + g_autofree char *value = NULL; + if (!*params[i].field) continue; value = vshGetTypedParamValue(ctl, params+i); vshPrint(ctl, "%s %s %s\n", device, params[i].field, value); - VIR_FREE(value); } } @@ -1939,7 +1931,6 @@ cmdList(vshControl *ctl, const vshCmd *cmd) bool optName = vshCommandOptBool(cmd, "name"); bool optID = vshCommandOptBool(cmd, "id"); size_t i; - char *title; char uuid[VIR_UUID_STRING_BUFLEN]; int state; bool ret = false; @@ -2022,6 +2013,8 @@ cmdList(vshControl *ctl, const vshCmd *cmd) state = -2; if (optTitle) { + g_autofree char *title = NULL; + if (!(title = virshGetDomainDescription(ctl, dom, true, 0))) goto cleanup; if (vshTableRowAppend(table, id_buf, @@ -2030,7 +2023,6 @@ cmdList(vshControl *ctl, const vshCmd *cmd) : virshDomainStateToString(state), title, NULL) < 0) goto cleanup; - VIR_FREE(title); } else { if (vshTableRowAppend(table, id_buf, virDomainGetName(dom), @@ -2187,7 +2179,6 @@ virshDomainStatsPrintRecord(vshControl *ctl G_GNUC_UNUSED, virDomainStatsRecordPtr record, bool raw G_GNUC_UNUSED) { - char *param; size_t i; vshPrint(ctl, "Domain: '%s'\n", virDomainGetName(record->dom)); @@ -2195,12 +2186,12 @@ virshDomainStatsPrintRecord(vshControl *ctl G_GNUC_UNUSED, /* XXX: Implement pretty-printing */ for (i = 0; i < record->nparams; i++) { + g_autofree char *param = NULL; + if (!(param = vshGetTypedParamValue(ctl, record->params + i))) return false; vshPrint(ctl, " %s=%s\n", record->params[i].field, param); - - VIR_FREE(param); } return true; @@ -2400,7 +2391,6 @@ cmdDomIfAddr(vshControl *ctl, const vshCmd *cmd) for (i = 0; i < ifaces_count; i++) { virDomainInterfacePtr iface = ifaces[i]; - char *ip_addr_str = NULL; const char *type = NULL; if (ifacestr && STRNEQ(ifacestr, iface->name)) @@ -2416,6 +2406,7 @@ cmdDomIfAddr(vshControl *ctl, const vshCmd *cmd) for (j = 0; j < iface->naddrs; j++) { g_auto(virBuffer) buf = VIR_BUFFER_INITIALIZER; + g_autofree char *ip_addr_str = NULL; switch (iface->addrs[j].type) { case VIR_IP_ADDR_TYPE_IPV4: @@ -2443,8 +2434,6 @@ cmdDomIfAddr(vshControl *ctl, const vshCmd *cmd) else vshPrint(ctl, " %-10s %-17s %s\n", "-", "-", ip_addr_str); - - VIR_FREE(ip_addr_str); } } diff --git a/tools/virsh-domain.c b/tools/virsh-domain.c index f72ec36f6f..542e2a1736 100644 --- a/tools/virsh-domain.c +++ b/tools/virsh-domain.c @@ -3055,7 +3055,6 @@ cmdDomIfSetLink(vshControl *ctl, const vshCmd *cmd) g_autoptr(virshDomain) dom = NULL; const char *iface; const char *state; - char *value; virMacAddr macaddr; const char *element; const char *attr; @@ -3119,13 +3118,10 @@ cmdDomIfSetLink(vshControl *ctl, const vshCmd *cmd) while (cur) { if (cur->type == XML_ELEMENT_NODE && virXMLNodeNameEqual(cur, element)) { - value = virXMLPropString(cur, attr); + g_autofree char *value = virXMLPropString(cur, attr); - if (STRCASEEQ(value, iface)) { - VIR_FREE(value); + if (STRCASEEQ(value, iface)) goto hit; - } - VIR_FREE(value); } cur = cur->next; } @@ -3639,9 +3635,6 @@ cmdUndefine(vshControl *ctl, const vshCmd *cmd) g_autoptr(xmlXPathContext) ctxt = NULL; xmlNodePtr *vol_nodes = NULL; /* XML nodes of volumes of the guest */ int nvol_nodes; - char *source = NULL; - char *target = NULL; - char *pool = NULL; size_t i; size_t j; virshControl *priv = ctl->privData; @@ -3759,14 +3752,13 @@ cmdUndefine(vshControl *ctl, const vshCmd *cmd) goto error; for (i = 0; i < nvol_nodes; i++) { + g_autofree char *source = NULL; + g_autofree char *target = NULL; + g_autofree char *pool = NULL; virshUndefineVolume vol; ctxt->node = vol_nodes[i]; - VIR_FREE(source); - VIR_FREE(target); - VIR_FREE(pool); - /* get volume source and target paths */ if (!(target = virXPathString("string(./target/@dev)", ctxt))) goto error; @@ -3936,9 +3928,6 @@ cmdUndefine(vshControl *ctl, const vshCmd *cmd) } cleanup: - VIR_FREE(source); - VIR_FREE(target); - VIR_FREE(pool); for (i = 0; i < nvols; i++) { VIR_FREE(vols[i].source); VIR_FREE(vols[i].target); @@ -5096,7 +5085,6 @@ cmdSchedInfoUpdate(vshControl *ctl, const vshCmd *cmd, virTypedParameterPtr src_params, int nsrc_params, virTypedParameterPtr *update_params) { - char *set_field = NULL; char *set_val = NULL; const char *val = NULL; const vshCmdOpt *opt = NULL; @@ -5107,7 +5095,8 @@ cmdSchedInfoUpdate(vshControl *ctl, const vshCmd *cmd, int rv; while ((opt = vshCommandOptArgv(ctl, cmd, opt))) { - set_field = g_strdup(opt->data); + g_autofree char *set_field = g_strdup(opt->data); + if (!(set_val = strchr(set_field, '='))) { vshError(ctl, "%s", _("Invalid syntax for --set, " "expecting name=value")); @@ -5121,8 +5110,6 @@ cmdSchedInfoUpdate(vshControl *ctl, const vshCmd *cmd, ¶ms, &nparams, &maxparams, set_field, set_val) < 0) goto cleanup; - - VIR_FREE(set_field); } rv = vshCommandOptStringReq(ctl, cmd, "cap", &val); @@ -5145,7 +5132,6 @@ cmdSchedInfoUpdate(vshControl *ctl, const vshCmd *cmd, *update_params = g_steal_pointer(¶ms); cleanup: - VIR_FREE(set_field); virTypedParamsFree(params, nparams); return ret; } @@ -6759,7 +6745,6 @@ virshDomainGetVcpuBitmap(vshControl *ctl, unsigned int curvcpus = 0; unsigned int maxvcpus = 0; unsigned int vcpuid; - char *online = NULL; if (inactive) flags |= VIR_DOMAIN_XML_INACTIVE; @@ -6788,6 +6773,8 @@ virshDomainGetVcpuBitmap(vshControl *ctl, } for (i = 0; i < nnodes; i++) { + g_autofree char *online = NULL; + ctxt->node = nodes[i]; if (virXPathUInt("string(@id)", ctxt, &vcpuid) < 0 || @@ -6796,8 +6783,6 @@ virshDomainGetVcpuBitmap(vshControl *ctl, if (STREQ(online, "yes")) ignore_value(virBitmapSetBit(ret, vcpuid)); - - VIR_FREE(online); } if (virBitmapCountBits(ret) != curvcpus) { @@ -6807,7 +6792,6 @@ virshDomainGetVcpuBitmap(vshControl *ctl, } cleanup: - VIR_FREE(online); VIR_FREE(nodes); return ret; } -- 2.31.1