On 7/8/20 4:19 PM, Nicolas Brignone wrote:
All pointers to virXMLPropString() use g_autofree.
I changed the summary line like this, to be more precise:
conf: use g_autofree for all pointers to virXMLPropString() in device_conf.c
All modified functions are similar, in all cases "cleanup"
label is removed,
along with all the "goto" calls.
I've been advised in the recent past to put the g_autofree additions and
corresponding removals of free functions into one patch, then do the
removal of the extra labels (in favor of directly returning) in a
separate patch to make it easier to hand-verify / review. Here's a
couple recent examples:
https://www.redhat.com/archives/libvir-list/2020-July/msg00317.html
In your case the changes are few enough that I'm okay with it a single
patch, except...
Signed-off-by: Nicolas Brignone <nmbrignone(a)gmail.com>
---
src/conf/device_conf.c | 183 +++++++++++++----------------------------
1 file changed, 56 insertions(+), 127 deletions(-)
diff --git a/src/conf/device_conf.c b/src/conf/device_conf.c
index 7d48a3f..9fa6141 100644
--- a/src/conf/device_conf.c
+++ b/src/conf/device_conf.c
@@ -208,45 +208,43 @@ int
virPCIDeviceAddressParseXML(xmlNodePtr node,
virPCIDeviceAddressPtr addr)
{
- char *domain, *slot, *bus, *function, *multi;
xmlNodePtr cur;
xmlNodePtr zpci = NULL;
- int ret = -1;
memset(addr, 0, sizeof(*addr));
- domain = virXMLPropString(node, "domain");
- bus = virXMLPropString(node, "bus");
- slot = virXMLPropString(node, "slot");
- function = virXMLPropString(node, "function");
- multi = virXMLPropString(node, "multifunction");
+ g_autofree char *domain = virXMLPropString(node, "domain");
+ g_autofree char *bus = virXMLPropString(node, "bus");
+ g_autofree char *slot = virXMLPropString(node, "slot");
+ g_autofree char *function = virXMLPropString(node, "function");
+ g_autofree char *multi = virXMLPropString(node, "multifunction");
... you've modified it so that local variables are being declared
*below* a line of executable code rather than at the top of the block.
Although I don't see anything in the coding style document
(
https://libvirt.org/coding-style.html) about it, and it may just be
leftover from a time when we supported a compiler that required all
declarations to be at top of scope, I think pretty much all of libvirts
code declares all local variables at the top of the scope.
That's simple enough for me to just fixup before pushing, so
Reviewed-by: Laine Stump <laine(a)redhat.com>
Congratulations on your first libvirt patch! :-)
if (domain &&
virStrToLong_uip(domain, NULL, 0, &addr->domain) < 0) {
virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
_("Cannot parse <address> 'domain'
attribute"));
- goto cleanup;
+ return -1;
}
if (bus &&
virStrToLong_uip(bus, NULL, 0, &addr->bus) < 0) {
virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
_("Cannot parse <address> 'bus'
attribute"));
- goto cleanup;
+ return -1;
}
if (slot &&
virStrToLong_uip(slot, NULL, 0, &addr->slot) < 0) {
virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
_("Cannot parse <address> 'slot'
attribute"));
- goto cleanup;
+ return -1;
}
if (function &&
virStrToLong_uip(function, NULL, 0, &addr->function) < 0) {
virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
_("Cannot parse <address> 'function'
attribute"));
- goto cleanup;
+ return -1;
}
if (multi &&
@@ -254,11 +252,11 @@ virPCIDeviceAddressParseXML(xmlNodePtr node,
virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
_("Unknown value '%s' for <address>
'multifunction' attribute"),
multi);
- goto cleanup;
+ return -1;
}
if (!virPCIDeviceAddressIsEmpty(addr) && !virPCIDeviceAddressIsValid(addr,
true))
- goto cleanup;
+ return -1;
cur = node->children;
while (cur) {
@@ -270,17 +268,9 @@ virPCIDeviceAddressParseXML(xmlNodePtr node,
}
if (zpci && virZPCIDeviceAddressParseXML(zpci, addr) < 0)
- goto cleanup;
+ return -1;
- ret = 0;
-
- cleanup:
- VIR_FREE(domain);
- VIR_FREE(bus);
- VIR_FREE(slot);
- VIR_FREE(function);
- VIR_FREE(multi);
- return ret;
+ return 0;
}
void
@@ -309,187 +299,149 @@ int
virDomainDeviceCCWAddressParseXML(xmlNodePtr node,
virDomainDeviceCCWAddressPtr addr)
{
- int ret = -1;
- char *cssid;
- char *ssid;
- char *devno;
-
memset(addr, 0, sizeof(*addr));
- cssid = virXMLPropString(node, "cssid");
- ssid = virXMLPropString(node, "ssid");
- devno = virXMLPropString(node, "devno");
+ g_autofree char *cssid = virXMLPropString(node, "cssid");
+ g_autofree char *ssid = virXMLPropString(node, "ssid");
+ g_autofree char *devno = virXMLPropString(node, "devno");
if (cssid && ssid && devno) {
if (cssid &&
virStrToLong_uip(cssid, NULL, 0, &addr->cssid) < 0) {
virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
_("Cannot parse <address> 'cssid'
attribute"));
- goto cleanup;
+ return -1;
}
if (ssid &&
virStrToLong_uip(ssid, NULL, 0, &addr->ssid) < 0) {
virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
_("Cannot parse <address> 'ssid'
attribute"));
- goto cleanup;
+ return -1;
}
if (devno &&
virStrToLong_uip(devno, NULL, 0, &addr->devno) < 0) {
virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
_("Cannot parse <address> 'devno'
attribute"));
- goto cleanup;
+ return -1;
}
if (!virDomainDeviceCCWAddressIsValid(addr)) {
virReportError(VIR_ERR_INTERNAL_ERROR,
_("Invalid specification for virtio ccw"
" address: cssid='%s' ssid='%s'
devno='%s'"),
cssid, ssid, devno);
- goto cleanup;
+ return -1;
}
addr->assigned = true;
} else if (cssid || ssid || devno) {
virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
_("Invalid partial specification for virtio ccw"
" address"));
- goto cleanup;
+ return -1;
}
- ret = 0;
-
- cleanup:
- VIR_FREE(cssid);
- VIR_FREE(ssid);
- VIR_FREE(devno);
- return ret;
+ return 0;
}
int
virDomainDeviceDriveAddressParseXML(xmlNodePtr node,
virDomainDeviceDriveAddressPtr addr)
{
- char *bus, *unit, *controller, *target;
- int ret = -1;
-
memset(addr, 0, sizeof(*addr));
- controller = virXMLPropString(node, "controller");
- bus = virXMLPropString(node, "bus");
- target = virXMLPropString(node, "target");
- unit = virXMLPropString(node, "unit");
+ g_autofree char *controller = virXMLPropString(node, "controller");
+ g_autofree char *bus = virXMLPropString(node, "bus");
+ g_autofree char *target = virXMLPropString(node, "target");
+ g_autofree char *unit = virXMLPropString(node, "unit");
if (controller &&
virStrToLong_uip(controller, NULL, 10, &addr->controller) < 0) {
virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
_("Cannot parse <address> 'controller'
attribute"));
- goto cleanup;
+ return -1;
}
if (bus &&
virStrToLong_uip(bus, NULL, 10, &addr->bus) < 0) {
virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
_("Cannot parse <address> 'bus'
attribute"));
- goto cleanup;
+ return -1;
}
if (target &&
virStrToLong_uip(target, NULL, 10, &addr->target) < 0) {
virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
_("Cannot parse <address> 'target'
attribute"));
- goto cleanup;
+ return -1;
}
if (unit &&
virStrToLong_uip(unit, NULL, 10, &addr->unit) < 0) {
virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
_("Cannot parse <address> 'unit'
attribute"));
- goto cleanup;
+ return -1;
}
- ret = 0;
-
- cleanup:
- VIR_FREE(controller);
- VIR_FREE(bus);
- VIR_FREE(target);
- VIR_FREE(unit);
- return ret;
+ return 0;
}
int
virDomainDeviceVirtioSerialAddressParseXML(xmlNodePtr node,
virDomainDeviceVirtioSerialAddressPtr addr)
{
- char *controller, *bus, *port;
- int ret = -1;
-
memset(addr, 0, sizeof(*addr));
- controller = virXMLPropString(node, "controller");
- bus = virXMLPropString(node, "bus");
- port = virXMLPropString(node, "port");
+ g_autofree char *controller = virXMLPropString(node, "controller");
+ g_autofree char *bus = virXMLPropString(node, "bus");
+ g_autofree char *port = virXMLPropString(node, "port");
if (controller &&
virStrToLong_uip(controller, NULL, 10, &addr->controller) < 0) {
virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
_("Cannot parse <address> 'controller'
attribute"));
- goto cleanup;
+ return -1;
}
if (bus &&
virStrToLong_uip(bus, NULL, 10, &addr->bus) < 0) {
virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
_("Cannot parse <address> 'bus'
attribute"));
- goto cleanup;
+ return -1;
}
if (port &&
virStrToLong_uip(port, NULL, 10, &addr->port) < 0) {
virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
_("Cannot parse <address> 'port'
attribute"));
- goto cleanup;
+ return -1;
}
- ret = 0;
-
- cleanup:
- VIR_FREE(controller);
- VIR_FREE(bus);
- VIR_FREE(port);
- return ret;
+ return 0;
}
int
virDomainDeviceCcidAddressParseXML(xmlNodePtr node,
virDomainDeviceCcidAddressPtr addr)
{
- char *controller, *slot;
- int ret = -1;
-
memset(addr, 0, sizeof(*addr));
- controller = virXMLPropString(node, "controller");
- slot = virXMLPropString(node, "slot");
+ g_autofree char *controller = virXMLPropString(node, "controller");
+ g_autofree char *slot = virXMLPropString(node, "slot");
if (controller &&
virStrToLong_uip(controller, NULL, 10, &addr->controller) < 0) {
virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
_("Cannot parse <address> 'controller'
attribute"));
- goto cleanup;
+ return -1;
}
if (slot &&
virStrToLong_uip(slot, NULL, 10, &addr->slot) < 0) {
virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
_("Cannot parse <address> 'slot'
attribute"));
- goto cleanup;
+ return -1;
}
- ret = 0;
-
- cleanup:
- VIR_FREE(controller);
- VIR_FREE(slot);
- return ret;
+ return 0;
}
static int
@@ -519,57 +471,41 @@ int
virDomainDeviceUSBAddressParseXML(xmlNodePtr node,
virDomainDeviceUSBAddressPtr addr)
{
- char *port, *bus;
- int ret = -1;
memset(addr, 0, sizeof(*addr));
- port = virXMLPropString(node, "port");
- bus = virXMLPropString(node, "bus");
+ g_autofree char *port = virXMLPropString(node, "port");
+ g_autofree char *bus = virXMLPropString(node, "bus");
if (port && virDomainDeviceUSBAddressParsePort(addr, port) < 0)
- goto cleanup;
+ return -1;
if (bus &&
virStrToLong_uip(bus, NULL, 10, &addr->bus) < 0) {
virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
_("Cannot parse <address> 'bus'
attribute"));
- goto cleanup;
+ return -1;
}
-
- ret = 0;
-
- cleanup:
- VIR_FREE(bus);
- VIR_FREE(port);
- return ret;
+ return 0;
}
int
virDomainDeviceSpaprVioAddressParseXML(xmlNodePtr node,
virDomainDeviceSpaprVioAddressPtr addr)
{
- char *reg;
- int ret;
-
memset(addr, 0, sizeof(*addr));
- reg = virXMLPropString(node, "reg");
+ g_autofree char *reg = virXMLPropString(node, "reg");
if (reg) {
if (virStrToLong_ull(reg, NULL, 16, &addr->reg) < 0) {
virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
_("Cannot parse <address> 'reg'
attribute"));
- ret = -1;
- goto cleanup;
+ return -1;
}
addr->has_reg = true;
}
-
- ret = 0;
- cleanup:
- VIR_FREE(reg);
- return ret;
+ return 0;
}
bool
@@ -604,19 +540,17 @@ int
virInterfaceLinkParseXML(xmlNodePtr node,
virNetDevIfLinkPtr lnk)
{
- int ret = -1;
- char *stateStr, *speedStr;
int state;
- stateStr = virXMLPropString(node, "state");
- speedStr = virXMLPropString(node, "speed");
+ g_autofree char *stateStr = virXMLPropString(node, "state");
+ g_autofree char *speedStr = virXMLPropString(node, "speed");
if (stateStr) {
if ((state = virNetDevIfStateTypeFromString(stateStr)) < 0) {
virReportError(VIR_ERR_XML_ERROR,
_("unknown link state: %s"),
stateStr);
- goto cleanup;
+ return -1;
}
lnk->state = state;
}
@@ -626,14 +560,9 @@ virInterfaceLinkParseXML(xmlNodePtr node,
virReportError(VIR_ERR_XML_ERROR,
_("Unable to parse link speed: %s"),
speedStr);
- goto cleanup;
+ return -1;
}
-
- ret = 0;
- cleanup:
- VIR_FREE(stateStr);
- VIR_FREE(speedStr);
- return ret;
+ return 0;
}
int