[PATCH] lib: Introduce and use g_autoptr() for virInterfaceDef

Michal Privoznik posted 1 patch 2 years, 5 months ago
Test syntax-check failed
Patches applied successfully (tree, apply log)
git fetch https://github.com/patchew-project/libvirt tags/patchew/fd0605a81abb16942bb9ab7a93aefe7f12327752.1635780096.git.mprivozn@redhat.com
src/conf/interface_conf.c               | 32 ++++++++---------
src/conf/interface_conf.h               |  1 +
src/conf/virinterfaceobj.c              |  3 +-
src/interface/interface_backend_netcf.c | 47 ++++++++-----------------
src/interface/interface_backend_udev.c  | 29 +++++----------
src/test/test_driver.c                  | 17 ++++-----
tests/interfacexml2xmltest.c            | 17 ++++-----
7 files changed, 53 insertions(+), 93 deletions(-)
[PATCH] lib: Introduce and use g_autoptr() for virInterfaceDef
Posted by Michal Privoznik 2 years, 5 months ago
There are a lot of places where we call virInterfaceDefFree()
explicitly. We can define autoptr cleanup macro and annotate
declarations with g_autoptr() and remove plenty of those explicit
free calls.

Signed-off-by: Michal Privoznik <mprivozn@redhat.com>
---
 src/conf/interface_conf.c               | 32 ++++++++---------
 src/conf/interface_conf.h               |  1 +
 src/conf/virinterfaceobj.c              |  3 +-
 src/interface/interface_backend_netcf.c | 47 ++++++++-----------------
 src/interface/interface_backend_udev.c  | 29 +++++----------
 src/test/test_driver.c                  | 17 ++++-----
 tests/interfacexml2xmltest.c            | 17 ++++-----
 7 files changed, 53 insertions(+), 93 deletions(-)

diff --git a/src/conf/interface_conf.c b/src/conf/interface_conf.c
index b45dc37379..f2b3804bec 100644
--- a/src/conf/interface_conf.c
+++ b/src/conf/interface_conf.c
@@ -679,7 +679,7 @@ static virInterfaceDef *
 virInterfaceDefParseXML(xmlXPathContextPtr ctxt,
                         int parentIfType)
 {
-    virInterfaceDef *def;
+    g_autoptr(virInterfaceDef) def = NULL;
     int type;
     char *tmp;
     VIR_XPATH_NODE_AUTORESTORE(ctxt)
@@ -716,28 +716,28 @@ virInterfaceDefParseXML(xmlXPathContextPtr ctxt,
         virReportError(VIR_ERR_XML_ERROR,
                        _("interface has unsupported type '%s'"),
                        virInterfaceTypeToString(type));
-        goto error;
+        return NULL;
     }
     def->type = type;
 
     if (virInterfaceDefParseName(def, ctxt) < 0)
-       goto error;
+       return NULL;
 
     if (parentIfType == VIR_INTERFACE_TYPE_LAST) {
         /* only recognize these in toplevel bond interfaces */
         if (virInterfaceDefParseStartMode(def, ctxt) < 0)
-            goto error;
+            return NULL;
         if (virInterfaceDefParseMtu(def, ctxt) < 0)
-            goto error;
+            return NULL;
         if (virInterfaceDefParseIfAdressing(def, ctxt) < 0)
-            goto error;
+            return NULL;
     }
 
     if (type != VIR_INTERFACE_TYPE_BRIDGE) {
         /* link status makes no sense for a bridge */
         lnk = virXPathNode("./link", ctxt);
         if (lnk && virInterfaceLinkParseXML(lnk, &def->lnk) < 0)
-            goto error;
+            return NULL;
     }
 
     switch (type) {
@@ -751,11 +751,11 @@ virInterfaceDefParseXML(xmlXPathContextPtr ctxt,
             if (!(bridge = virXPathNode("./bridge[1]", ctxt))) {
                 virReportError(VIR_ERR_XML_ERROR,
                                "%s", _("bridge interface misses the bridge element"));
-                goto error;
+                return NULL;
             }
             ctxt->node = bridge;
             if (virInterfaceDefParseBridge(def, ctxt) < 0)
-                goto error;
+                return NULL;
             break;
         }
         case VIR_INTERFACE_TYPE_BOND: {
@@ -764,11 +764,11 @@ virInterfaceDefParseXML(xmlXPathContextPtr ctxt,
             if (!(bond = virXPathNode("./bond[1]", ctxt))) {
                 virReportError(VIR_ERR_XML_ERROR,
                                "%s", _("bond interface misses the bond element"));
-                goto error;
+                return NULL;
             }
             ctxt->node = bond;
             if (virInterfaceDefParseBond(def, ctxt)  < 0)
-                goto error;
+                return NULL;
             break;
         }
         case VIR_INTERFACE_TYPE_VLAN: {
@@ -777,21 +777,17 @@ virInterfaceDefParseXML(xmlXPathContextPtr ctxt,
             if (!(vlan = virXPathNode("./vlan[1]", ctxt))) {
                 virReportError(VIR_ERR_XML_ERROR,
                                "%s", _("vlan interface misses the vlan element"));
-                goto error;
+                return NULL;
             }
             ctxt->node = vlan;
             if (virInterfaceDefParseVlan(def, ctxt)  < 0)
-                goto error;
+                return NULL;
             break;
         }
 
     }
 
-    return def;
-
- error:
-    virInterfaceDefFree(def);
-    return NULL;
+    return g_steal_pointer(&def);
 }
 
 
diff --git a/src/conf/interface_conf.h b/src/conf/interface_conf.h
index ea92e0fb31..510d83b2bf 100644
--- a/src/conf/interface_conf.h
+++ b/src/conf/interface_conf.h
@@ -153,6 +153,7 @@ struct _virInterfaceDef {
 
 void
 virInterfaceDefFree(virInterfaceDef *def);
+G_DEFINE_AUTOPTR_CLEANUP_FUNC(virInterfaceDef, virInterfaceDefFree);
 
 virInterfaceDef *
 virInterfaceDefParseString(const char *xmlStr,
diff --git a/src/conf/virinterfaceobj.c b/src/conf/virinterfaceobj.c
index 9439bb3d0b..ceb3ae7595 100644
--- a/src/conf/virinterfaceobj.c
+++ b/src/conf/virinterfaceobj.c
@@ -362,7 +362,7 @@ virInterfaceObjListCloneCb(void *payload,
     virInterfaceObj *srcObj = payload;
     struct _virInterfaceObjListCloneData *data = opaque;
     char *xml = NULL;
-    virInterfaceDef *backup = NULL;
+    g_autoptr(virInterfaceDef) backup = NULL;
     virInterfaceObj *obj;
 
     if (data->error)
@@ -387,7 +387,6 @@ virInterfaceObjListCloneCb(void *payload,
  error:
     data->error = true;
     VIR_FREE(xml);
-    virInterfaceDefFree(backup);
     virObjectUnlock(srcObj);
     return 0;
 }
diff --git a/src/interface/interface_backend_netcf.c b/src/interface/interface_backend_netcf.c
index 78fd4f9bc7..146a703953 100644
--- a/src/interface/interface_backend_netcf.c
+++ b/src/interface/interface_backend_netcf.c
@@ -387,7 +387,7 @@ static int netcfConnectNumOfInterfacesImpl(virConnectPtr conn,
     }
 
     for (i = 0; i < count; i++) {
-        virInterfaceDef *def;
+        g_autoptr(virInterfaceDef) def = NULL;
         struct netcf_if *iface;
 
         iface = ncf_lookup_by_name(driver->netcf, names[i]);
@@ -416,11 +416,8 @@ static int netcfConnectNumOfInterfacesImpl(virConnectPtr conn,
         }
         ncf_if_free(iface);
 
-        if (!filter(conn, def)) {
-            virInterfaceDefFree(def);
+        if (!filter(conn, def))
             continue;
-        }
-        virInterfaceDefFree(def);
 
         want++;
     }
@@ -481,7 +478,7 @@ static int netcfConnectListInterfacesImpl(virConnectPtr conn,
     }
 
     for (i = 0; i < count && want < nnames; i++) {
-        virInterfaceDef *def;
+        g_autoptr(virInterfaceDef) def = NULL;
         struct netcf_if *iface;
 
         iface = ncf_lookup_by_name(driver->netcf, allnames[i]);
@@ -510,11 +507,8 @@ static int netcfConnectListInterfacesImpl(virConnectPtr conn,
         }
         ncf_if_free(iface);
 
-        if (!filter(conn, def)) {
-            virInterfaceDefFree(def);
+        if (!filter(conn, def))
             continue;
-        }
-        virInterfaceDefFree(def);
 
         names[want++] = g_steal_pointer(&allnames[i]);
     }
@@ -665,7 +659,7 @@ netcfConnectListAllInterfaces(virConnectPtr conn,
         tmp_iface_objs = g_new0(virInterfacePtr, count + 1);
 
     for (i = 0; i < count; i++) {
-        virInterfaceDef *def;
+        g_autoptr(virInterfaceDef) def = NULL;
 
         iface = ncf_lookup_by_name(driver->netcf, names[i]);
         if (!iface) {
@@ -693,20 +687,17 @@ netcfConnectListAllInterfaces(virConnectPtr conn,
         if (!virConnectListAllInterfacesCheckACL(conn, def)) {
             ncf_if_free(iface);
             iface = NULL;
-            virInterfaceDefFree(def);
             continue;
         }
 
         if (ifaces) {
-            if (!(iface_obj = virGetInterface(conn, def->name, def->mac))) {
-                virInterfaceDefFree(def);
+            if (!(iface_obj = virGetInterface(conn, def->name, def->mac)))
                 goto cleanup;
-            }
+
             tmp_iface_objs[niface_objs] = iface_obj;
         }
         niface_objs++;
 
-        virInterfaceDefFree(def);
         ncf_if_free(iface);
         iface = NULL;
     }
@@ -743,7 +734,7 @@ static virInterfacePtr netcfInterfaceLookupByName(virConnectPtr conn,
 {
     struct netcf_if *iface;
     virInterfacePtr ret = NULL;
-    virInterfaceDef *def = NULL;
+    g_autoptr(virInterfaceDef) def = NULL;
 
     virObjectLock(driver);
     iface = ncf_lookup_by_name(driver->netcf, name);
@@ -772,7 +763,6 @@ static virInterfacePtr netcfInterfaceLookupByName(virConnectPtr conn,
 
  cleanup:
     ncf_if_free(iface);
-    virInterfaceDefFree(def);
     virObjectUnlock(driver);
     return ret;
 }
@@ -783,7 +773,7 @@ static virInterfacePtr netcfInterfaceLookupByMACString(virConnectPtr conn,
     struct netcf_if *iface;
     int niface;
     virInterfacePtr ret = NULL;
-    virInterfaceDef *def = NULL;
+    g_autoptr(virInterfaceDef) def = NULL;
 
     virObjectLock(driver);
     niface = ncf_lookup_by_mac_string(driver->netcf, macstr, 1, &iface);
@@ -820,7 +810,6 @@ static virInterfacePtr netcfInterfaceLookupByMACString(virConnectPtr conn,
 
  cleanup:
     ncf_if_free(iface);
-    virInterfaceDefFree(def);
     virObjectUnlock(driver);
     return ret;
 }
@@ -830,7 +819,7 @@ static char *netcfInterfaceGetXMLDesc(virInterfacePtr ifinfo,
 {
     struct netcf_if *iface = NULL;
     char *xmlstr = NULL;
-    virInterfaceDef *ifacedef = NULL;
+    g_autoptr(virInterfaceDef) ifacedef = NULL;
     char *ret = NULL;
     bool active;
 
@@ -880,7 +869,6 @@ static char *netcfInterfaceGetXMLDesc(virInterfacePtr ifinfo,
  cleanup:
     ncf_if_free(iface);
     VIR_FREE(xmlstr);
-    virInterfaceDefFree(ifacedef);
     virObjectUnlock(driver);
     return ret;
 }
@@ -891,7 +879,7 @@ static virInterfacePtr netcfInterfaceDefineXML(virConnectPtr conn,
 {
     struct netcf_if *iface = NULL;
     char *xmlstr = NULL;
-    virInterfaceDef *ifacedef = NULL;
+    g_autoptr(virInterfaceDef) ifacedef = NULL;
     virInterfacePtr ret = NULL;
 
     virCheckFlags(VIR_INTERFACE_DEFINE_VALIDATE, NULL);
@@ -929,7 +917,6 @@ static virInterfacePtr netcfInterfaceDefineXML(virConnectPtr conn,
  cleanup:
     ncf_if_free(iface);
     VIR_FREE(xmlstr);
-    virInterfaceDefFree(ifacedef);
     virObjectUnlock(driver);
     return ret;
 }
@@ -937,7 +924,7 @@ static virInterfacePtr netcfInterfaceDefineXML(virConnectPtr conn,
 static int netcfInterfaceUndefine(virInterfacePtr ifinfo)
 {
     struct netcf_if *iface = NULL;
-    virInterfaceDef *def = NULL;
+    g_autoptr(virInterfaceDef) def = NULL;
     int ret = -1;
 
     virObjectLock(driver);
@@ -968,7 +955,6 @@ static int netcfInterfaceUndefine(virInterfacePtr ifinfo)
 
  cleanup:
     ncf_if_free(iface);
-    virInterfaceDefFree(def);
     virObjectUnlock(driver);
     return ret;
 }
@@ -977,7 +963,7 @@ static int netcfInterfaceCreate(virInterfacePtr ifinfo,
                                 unsigned int flags)
 {
     struct netcf_if *iface = NULL;
-    virInterfaceDef *def = NULL;
+    g_autoptr(virInterfaceDef) def = NULL;
     int ret = -1;
     bool active;
 
@@ -1020,7 +1006,6 @@ static int netcfInterfaceCreate(virInterfacePtr ifinfo,
 
  cleanup:
     ncf_if_free(iface);
-    virInterfaceDefFree(def);
     virObjectUnlock(driver);
     return ret;
 }
@@ -1029,7 +1014,7 @@ static int netcfInterfaceDestroy(virInterfacePtr ifinfo,
                                  unsigned int flags)
 {
     struct netcf_if *iface = NULL;
-    virInterfaceDef *def = NULL;
+    g_autoptr(virInterfaceDef) def = NULL;
     int ret = -1;
     bool active;
 
@@ -1072,7 +1057,6 @@ static int netcfInterfaceDestroy(virInterfacePtr ifinfo,
 
  cleanup:
     ncf_if_free(iface);
-    virInterfaceDefFree(def);
     virObjectUnlock(driver);
     return ret;
 }
@@ -1080,7 +1064,7 @@ static int netcfInterfaceDestroy(virInterfacePtr ifinfo,
 static int netcfInterfaceIsActive(virInterfacePtr ifinfo)
 {
     struct netcf_if *iface = NULL;
-    virInterfaceDef *def = NULL;
+    g_autoptr(virInterfaceDef) def = NULL;
     int ret = -1;
     bool active;
 
@@ -1105,7 +1089,6 @@ static int netcfInterfaceIsActive(virInterfacePtr ifinfo)
 
  cleanup:
     ncf_if_free(iface);
-    virInterfaceDefFree(def);
     virObjectUnlock(driver);
     return ret;
 }
diff --git a/src/interface/interface_backend_udev.c b/src/interface/interface_backend_udev.c
index 0217f16607..8c417714e5 100644
--- a/src/interface/interface_backend_udev.c
+++ b/src/interface/interface_backend_udev.c
@@ -165,7 +165,7 @@ udevNumOfInterfacesByStatus(virConnectPtr conn, virUdevStatus status,
     udev_list_entry_foreach(dev_entry, devices) {
         struct udev_device *dev;
         const char *path;
-        virInterfaceDef *def;
+        g_autoptr(virInterfaceDef) def = NULL;
 
         path = udev_list_entry_get_name(dev_entry);
         dev = udev_device_new_from_syspath(udev, path);
@@ -174,7 +174,6 @@ udevNumOfInterfacesByStatus(virConnectPtr conn, virUdevStatus status,
         if (filter(conn, def))
             count++;
         udev_device_unref(dev);
-        virInterfaceDefFree(def);
     }
 
  cleanup:
@@ -218,7 +217,7 @@ udevListInterfacesByStatus(virConnectPtr conn,
     udev_list_entry_foreach(dev_entry, devices) {
         struct udev_device *dev;
         const char *path;
-        virInterfaceDef *def;
+        g_autoptr(virInterfaceDef) def = NULL;
 
         /* Ensure we won't exceed the size of our array */
         if (count > names_len)
@@ -233,7 +232,6 @@ udevListInterfacesByStatus(virConnectPtr conn,
             count++;
         }
         udev_device_unref(dev);
-        virInterfaceDefFree(def);
     }
 
     udev_enumerate_unref(enumerate);
@@ -355,7 +353,7 @@ udevConnectListAllInterfaces(virConnectPtr conn,
         const char *path;
         const char *name;
         const char *macaddr;
-        virInterfaceDef *def;
+        g_autoptr(virInterfaceDef) def = NULL;
 
         path = udev_list_entry_get_name(dev_entry);
         dev = udev_device_new_from_syspath(udev, path);
@@ -366,10 +364,8 @@ udevConnectListAllInterfaces(virConnectPtr conn,
         def = udevGetMinimalDefForDevice(dev);
         if (!virConnectListAllInterfacesCheckACL(conn, def)) {
             udev_device_unref(dev);
-            virInterfaceDefFree(def);
             continue;
         }
-        virInterfaceDefFree(def);
 
         /* Filter the results */
         if (MATCH(VIR_CONNECT_LIST_INTERFACES_FILTERS_ACTIVE) &&
@@ -413,7 +409,7 @@ udevInterfaceLookupByName(virConnectPtr conn, const char *name)
     struct udev *udev = udev_ref(driver->udev);
     struct udev_device *dev;
     virInterfacePtr ret = NULL;
-    virInterfaceDef *def = NULL;
+    g_autoptr(virInterfaceDef) def = NULL;
 
     /* get a device reference based on the device name */
     dev = udev_device_new_from_subsystem_sysname(udev, "net", name);
@@ -435,7 +431,6 @@ udevInterfaceLookupByName(virConnectPtr conn, const char *name)
 
  cleanup:
     udev_unref(udev);
-    virInterfaceDefFree(def);
 
     return ret;
 }
@@ -447,7 +442,7 @@ udevInterfaceLookupByMACString(virConnectPtr conn, const char *macstr)
     struct udev_enumerate *enumerate = NULL;
     struct udev_list_entry *dev_entry;
     struct udev_device *dev;
-    virInterfaceDef *def = NULL;
+    g_autoptr(virInterfaceDef) def = NULL;
     virInterfacePtr ret = NULL;
 
     enumerate = udevGetDevices(udev, VIR_UDEV_IFACE_ALL);
@@ -499,7 +494,6 @@ udevInterfaceLookupByMACString(virConnectPtr conn, const char *macstr)
     if (enumerate)
         udev_enumerate_unref(enumerate);
     udev_unref(udev);
-    virInterfaceDefFree(def);
 
     return ret;
 }
@@ -945,7 +939,7 @@ static virInterfaceDef * ATTRIBUTE_NONNULL(1)
 udevGetIfaceDef(struct udev *udev, const char *name)
 {
     struct udev_device *dev = NULL;
-    virInterfaceDef *ifacedef;
+    g_autoptr(virInterfaceDef) ifacedef = NULL;
     unsigned int mtu;
     const char *mtu_str;
     char *vlan_parent_dev = NULL;
@@ -1038,13 +1032,11 @@ udevGetIfaceDef(struct udev *udev, const char *name)
 
     udev_device_unref(dev);
 
-    return ifacedef;
+    return g_steal_pointer(&ifacedef);
 
  error:
     udev_device_unref(dev);
 
-    virInterfaceDefFree(ifacedef);
-
     return NULL;
 }
 
@@ -1053,7 +1045,7 @@ udevInterfaceGetXMLDesc(virInterfacePtr ifinfo,
                         unsigned int flags)
 {
     struct udev *udev = udev_ref(driver->udev);
-    virInterfaceDef *ifacedef;
+    g_autoptr(virInterfaceDef) ifacedef = NULL;
     char *xmlstr = NULL;
 
     virCheckFlags(VIR_INTERFACE_XML_INACTIVE, NULL);
@@ -1071,8 +1063,6 @@ udevInterfaceGetXMLDesc(virInterfacePtr ifinfo,
 
     xmlstr = virInterfaceDefFormat(ifacedef);
 
-    virInterfaceDefFree(ifacedef);
-
  cleanup:
     /* decrement our udev ptr */
     udev_unref(udev);
@@ -1085,7 +1075,7 @@ udevInterfaceIsActive(virInterfacePtr ifinfo)
 {
     struct udev *udev = udev_ref(driver->udev);
     struct udev_device *dev;
-    virInterfaceDef *def = NULL;
+    g_autoptr(virInterfaceDef) def = NULL;
     int status = -1;
 
     dev = udev_device_new_from_subsystem_sysname(udev, "net",
@@ -1110,7 +1100,6 @@ udevInterfaceIsActive(virInterfacePtr ifinfo)
 
  cleanup:
     udev_unref(udev);
-    virInterfaceDefFree(def);
 
     return status;
 }
diff --git a/src/test/test_driver.c b/src/test/test_driver.c
index 13d07e570e..ea474d55ac 100644
--- a/src/test/test_driver.c
+++ b/src/test/test_driver.c
@@ -1096,7 +1096,7 @@ testParseNetworks(testDriver *privconn,
         return -1;
 
     for (i = 0; i < num; i++) {
-        virNetworkDef *def;
+        g_autoptr(virNetworkDef) def = NULL;
         xmlNodePtr node = testParseXMLDocFromFile(nodes[i], file, "network");
         if (!node)
             return -1;
@@ -1105,10 +1105,9 @@ testParseNetworks(testDriver *privconn,
         if (!def)
             return -1;
 
-        if (!(obj = virNetworkObjAssignDef(privconn->networks, def, 0))) {
-            virNetworkDefFree(def);
+        if (!(obj = virNetworkObjAssignDef(privconn->networks, def, 0)))
             return -1;
-        }
+        def = NULL;
 
         virNetworkObjSetActive(obj, true);
         virNetworkObjEndAPI(&obj);
@@ -1133,7 +1132,7 @@ testParseInterfaces(testDriver *privconn,
         return -1;
 
     for (i = 0; i < num; i++) {
-        virInterfaceDef *def;
+        g_autoptr(virInterfaceDef) def = NULL;
         xmlNodePtr node = testParseXMLDocFromFile(nodes[i], file,
                                                    "interface");
         if (!node)
@@ -1143,10 +1142,9 @@ testParseInterfaces(testDriver *privconn,
         if (!def)
             return -1;
 
-        if (!(obj = virInterfaceObjListAssignDef(privconn->ifaces, def))) {
-            virInterfaceDefFree(def);
+        if (!(obj = virInterfaceObjListAssignDef(privconn->ifaces, def)))
             return -1;
-        }
+        def = NULL;
 
         virInterfaceObjSetActive(obj, true);
         virInterfaceObjEndAPI(&obj);
@@ -6195,7 +6193,7 @@ testInterfaceDefineXML(virConnectPtr conn,
                        unsigned int flags)
 {
     testDriver *privconn = conn->privateData;
-    virInterfaceDef *def;
+    g_autoptr(virInterfaceDef) def = NULL;
     virInterfaceObj *obj = NULL;
     virInterfaceDef *objdef;
     virInterfacePtr ret = NULL;
@@ -6214,7 +6212,6 @@ testInterfaceDefineXML(virConnectPtr conn,
     ret = virGetInterface(conn, objdef->name, objdef->mac);
 
  cleanup:
-    virInterfaceDefFree(def);
     virInterfaceObjEndAPI(&obj);
     virObjectUnlock(privconn);
     return ret;
diff --git a/tests/interfacexml2xmltest.c b/tests/interfacexml2xmltest.c
index 8235e701a9..15fab88107 100644
--- a/tests/interfacexml2xmltest.c
+++ b/tests/interfacexml2xmltest.c
@@ -18,28 +18,23 @@ testCompareXMLToXMLFiles(const char *xml)
 {
     g_autofree char *xmlData = NULL;
     g_autofree char *actual = NULL;
-    int ret = -1;
-    virInterfaceDef *dev = NULL;
+    g_autoptr(virInterfaceDef) dev = NULL;
 
     if (virTestLoadFile(xml, &xmlData) < 0)
-        goto fail;
+        return -1;
 
     if (!(dev = virInterfaceDefParseString(xmlData, 0)))
-        goto fail;
+        return -1;
 
     if (!(actual = virInterfaceDefFormat(dev)))
-        goto fail;
+        return -1;
 
     if (STRNEQ(xmlData, actual)) {
         virTestDifferenceFull(stderr, xmlData, xml, actual, NULL);
-        goto fail;
+        return -1;
     }
 
-    ret = 0;
-
- fail:
-    virInterfaceDefFree(dev);
-    return ret;
+    return 0;
 }
 
 static int
-- 
2.32.0

Re: [PATCH] lib: Introduce and use g_autoptr() for virInterfaceDef
Posted by Tim Wiederhake 2 years, 5 months ago
On Mon, 2021-11-01 at 16:25 +0100, Michal Privoznik wrote:
> There are a lot of places where we call virInterfaceDefFree()
> explicitly. We can define autoptr cleanup macro and annotate
> declarations with g_autoptr() and remove plenty of those explicit
> free calls.
> 
> Signed-off-by: Michal Privoznik <mprivozn@redhat.com>
> ---
>  src/conf/interface_conf.c               | 32 ++++++++---------
>  src/conf/interface_conf.h               |  1 +
>  src/conf/virinterfaceobj.c              |  3 +-
>  src/interface/interface_backend_netcf.c | 47 ++++++++---------------
> --
>  src/interface/interface_backend_udev.c  | 29 +++++----------
>  src/test/test_driver.c                  | 17 ++++-----
>  tests/interfacexml2xmltest.c            | 17 ++++-----
>  7 files changed, 53 insertions(+), 93 deletions(-)
> 
> diff --git a/src/conf/interface_conf.c b/src/conf/interface_conf.c
> index b45dc37379..f2b3804bec 100644
> --- a/src/conf/interface_conf.c
> +++ b/src/conf/interface_conf.c
> @@ -679,7 +679,7 @@ static virInterfaceDef *
>  virInterfaceDefParseXML(xmlXPathContextPtr ctxt,
>                          int parentIfType)
>  {
> -    virInterfaceDef *def;
> +    g_autoptr(virInterfaceDef) def = NULL;
>      int type;
>      char *tmp;
>      VIR_XPATH_NODE_AUTORESTORE(ctxt)
> @@ -716,28 +716,28 @@ virInterfaceDefParseXML(xmlXPathContextPtr
> ctxt,
>          virReportError(VIR_ERR_XML_ERROR,
>                         _("interface has unsupported type '%s'"),
>                         virInterfaceTypeToString(type));
> -        goto error;
> +        return NULL;
>      }
>      def->type = type;
>  
>      if (virInterfaceDefParseName(def, ctxt) < 0)
> -       goto error;
> +       return NULL;
>  
>      if (parentIfType == VIR_INTERFACE_TYPE_LAST) {
>          /* only recognize these in toplevel bond interfaces */
>          if (virInterfaceDefParseStartMode(def, ctxt) < 0)
> -            goto error;
> +            return NULL;
>          if (virInterfaceDefParseMtu(def, ctxt) < 0)
> -            goto error;
> +            return NULL;
>          if (virInterfaceDefParseIfAdressing(def, ctxt) < 0)
> -            goto error;
> +            return NULL;
>      }
>  
>      if (type != VIR_INTERFACE_TYPE_BRIDGE) {
>          /* link status makes no sense for a bridge */
>          lnk = virXPathNode("./link", ctxt);
>          if (lnk && virInterfaceLinkParseXML(lnk, &def->lnk) < 0)
> -            goto error;
> +            return NULL;
>      }
>  
>      switch (type) {
> @@ -751,11 +751,11 @@ virInterfaceDefParseXML(xmlXPathContextPtr
> ctxt,
>              if (!(bridge = virXPathNode("./bridge[1]", ctxt))) {
>                  virReportError(VIR_ERR_XML_ERROR,
>                                 "%s", _("bridge interface misses the
> bridge element"));
> -                goto error;
> +                return NULL;
>              }
>              ctxt->node = bridge;
>              if (virInterfaceDefParseBridge(def, ctxt) < 0)
> -                goto error;
> +                return NULL;
>              break;
>          }
>          case VIR_INTERFACE_TYPE_BOND: {
> @@ -764,11 +764,11 @@ virInterfaceDefParseXML(xmlXPathContextPtr
> ctxt,
>              if (!(bond = virXPathNode("./bond[1]", ctxt))) {
>                  virReportError(VIR_ERR_XML_ERROR,
>                                 "%s", _("bond interface misses the
> bond element"));
> -                goto error;
> +                return NULL;
>              }
>              ctxt->node = bond;
>              if (virInterfaceDefParseBond(def, ctxt)  < 0)
> -                goto error;
> +                return NULL;
>              break;
>          }
>          case VIR_INTERFACE_TYPE_VLAN: {
> @@ -777,21 +777,17 @@ virInterfaceDefParseXML(xmlXPathContextPtr
> ctxt,
>              if (!(vlan = virXPathNode("./vlan[1]", ctxt))) {
>                  virReportError(VIR_ERR_XML_ERROR,
>                                 "%s", _("vlan interface misses the
> vlan element"));
> -                goto error;
> +                return NULL;
>              }
>              ctxt->node = vlan;
>              if (virInterfaceDefParseVlan(def, ctxt)  < 0)
> -                goto error;
> +                return NULL;
>              break;
>          }
>  
>      }
>  
> -    return def;
> -
> - error:
> -    virInterfaceDefFree(def);
> -    return NULL;
> +    return g_steal_pointer(&def);
>  }
>  
>  
> diff --git a/src/conf/interface_conf.h b/src/conf/interface_conf.h
> index ea92e0fb31..510d83b2bf 100644
> --- a/src/conf/interface_conf.h
> +++ b/src/conf/interface_conf.h
> @@ -153,6 +153,7 @@ struct _virInterfaceDef {
>  
>  void
>  virInterfaceDefFree(virInterfaceDef *def);
> +G_DEFINE_AUTOPTR_CLEANUP_FUNC(virInterfaceDef, virInterfaceDefFree);
>  
>  virInterfaceDef *
>  virInterfaceDefParseString(const char *xmlStr,
> diff --git a/src/conf/virinterfaceobj.c b/src/conf/virinterfaceobj.c
> index 9439bb3d0b..ceb3ae7595 100644
> --- a/src/conf/virinterfaceobj.c
> +++ b/src/conf/virinterfaceobj.c
> @@ -362,7 +362,7 @@ virInterfaceObjListCloneCb(void *payload,
>      virInterfaceObj *srcObj = payload;
>      struct _virInterfaceObjListCloneData *data = opaque;
>      char *xml = NULL;
> -    virInterfaceDef *backup = NULL;
> +    g_autoptr(virInterfaceDef) backup = NULL;
>      virInterfaceObj *obj;
>  
>      if (data->error)
> @@ -387,7 +387,6 @@ virInterfaceObjListCloneCb(void *payload,
>   error:
>      data->error = true;
>      VIR_FREE(xml);
> -    virInterfaceDefFree(backup);
>      virObjectUnlock(srcObj);
>      return 0;
>  }

I believe there is a `g_steal_pointer` or similar missing in the call
to `virInterfaceObjListAssignDef` (not shown in patch).

> diff --git a/src/interface/interface_backend_netcf.c
> b/src/interface/interface_backend_netcf.c
> index 78fd4f9bc7..146a703953 100644
> --- a/src/interface/interface_backend_netcf.c
> +++ b/src/interface/interface_backend_netcf.c
> @@ -387,7 +387,7 @@ static int
> netcfConnectNumOfInterfacesImpl(virConnectPtr conn,
>      }
>  
>      for (i = 0; i < count; i++) {
> -        virInterfaceDef *def;
> +        g_autoptr(virInterfaceDef) def = NULL;
>          struct netcf_if *iface;
>  
>          iface = ncf_lookup_by_name(driver->netcf, names[i]);
> @@ -416,11 +416,8 @@ static int
> netcfConnectNumOfInterfacesImpl(virConnectPtr conn,
>          }
>          ncf_if_free(iface);
>  
> -        if (!filter(conn, def)) {
> -            virInterfaceDefFree(def);
> +        if (!filter(conn, def))
>              continue;
> -        }
> -        virInterfaceDefFree(def);
>  
>          want++;
>      }
> @@ -481,7 +478,7 @@ static int
> netcfConnectListInterfacesImpl(virConnectPtr conn,
>      }
>  
>      for (i = 0; i < count && want < nnames; i++) {
> -        virInterfaceDef *def;
> +        g_autoptr(virInterfaceDef) def = NULL;
>          struct netcf_if *iface;
>  
>          iface = ncf_lookup_by_name(driver->netcf, allnames[i]);
> @@ -510,11 +507,8 @@ static int
> netcfConnectListInterfacesImpl(virConnectPtr conn,
>          }
>          ncf_if_free(iface);
>  
> -        if (!filter(conn, def)) {
> -            virInterfaceDefFree(def);
> +        if (!filter(conn, def))
>              continue;
> -        }
> -        virInterfaceDefFree(def);
>  
>          names[want++] = g_steal_pointer(&allnames[i]);
>      }
> @@ -665,7 +659,7 @@ netcfConnectListAllInterfaces(virConnectPtr conn,
>          tmp_iface_objs = g_new0(virInterfacePtr, count + 1);
>  
>      for (i = 0; i < count; i++) {
> -        virInterfaceDef *def;
> +        g_autoptr(virInterfaceDef) def = NULL;
>  
>          iface = ncf_lookup_by_name(driver->netcf, names[i]);
>          if (!iface) {
> @@ -693,20 +687,17 @@ netcfConnectListAllInterfaces(virConnectPtr
> conn,
>          if (!virConnectListAllInterfacesCheckACL(conn, def)) {
>              ncf_if_free(iface);
>              iface = NULL;
> -            virInterfaceDefFree(def);
>              continue;
>          }
>  
>          if (ifaces) {
> -            if (!(iface_obj = virGetInterface(conn, def->name, def-
> >mac))) {
> -                virInterfaceDefFree(def);
> +            if (!(iface_obj = virGetInterface(conn, def->name, def-
> >mac)))
>                  goto cleanup;
> -            }
> +
>              tmp_iface_objs[niface_objs] = iface_obj;
>          }
>          niface_objs++;
>  
> -        virInterfaceDefFree(def);
>          ncf_if_free(iface);
>          iface = NULL;
>      }
> @@ -743,7 +734,7 @@ static virInterfacePtr
> netcfInterfaceLookupByName(virConnectPtr conn,
>  {
>      struct netcf_if *iface;
>      virInterfacePtr ret = NULL;
> -    virInterfaceDef *def = NULL;
> +    g_autoptr(virInterfaceDef) def = NULL;
>  
>      virObjectLock(driver);
>      iface = ncf_lookup_by_name(driver->netcf, name);
> @@ -772,7 +763,6 @@ static virInterfacePtr
> netcfInterfaceLookupByName(virConnectPtr conn,
>  
>   cleanup:
>      ncf_if_free(iface);
> -    virInterfaceDefFree(def);
>      virObjectUnlock(driver);
>      return ret;
>  }
> @@ -783,7 +773,7 @@ static virInterfacePtr
> netcfInterfaceLookupByMACString(virConnectPtr conn,
>      struct netcf_if *iface;
>      int niface;
>      virInterfacePtr ret = NULL;
> -    virInterfaceDef *def = NULL;
> +    g_autoptr(virInterfaceDef) def = NULL;
>  
>      virObjectLock(driver);
>      niface = ncf_lookup_by_mac_string(driver->netcf, macstr, 1,
> &iface);
> @@ -820,7 +810,6 @@ static virInterfacePtr
> netcfInterfaceLookupByMACString(virConnectPtr conn,
>  
>   cleanup:
>      ncf_if_free(iface);
> -    virInterfaceDefFree(def);
>      virObjectUnlock(driver);
>      return ret;
>  }
> @@ -830,7 +819,7 @@ static char
> *netcfInterfaceGetXMLDesc(virInterfacePtr ifinfo,
>  {
>      struct netcf_if *iface = NULL;
>      char *xmlstr = NULL;
> -    virInterfaceDef *ifacedef = NULL;
> +    g_autoptr(virInterfaceDef) ifacedef = NULL;
>      char *ret = NULL;
>      bool active;
>  
> @@ -880,7 +869,6 @@ static char
> *netcfInterfaceGetXMLDesc(virInterfacePtr ifinfo,
>   cleanup:
>      ncf_if_free(iface);
>      VIR_FREE(xmlstr);
> -    virInterfaceDefFree(ifacedef);
>      virObjectUnlock(driver);
>      return ret;
>  }
> @@ -891,7 +879,7 @@ static virInterfacePtr
> netcfInterfaceDefineXML(virConnectPtr conn,
>  {
>      struct netcf_if *iface = NULL;
>      char *xmlstr = NULL;
> -    virInterfaceDef *ifacedef = NULL;
> +    g_autoptr(virInterfaceDef) ifacedef = NULL;
>      virInterfacePtr ret = NULL;
>  
>      virCheckFlags(VIR_INTERFACE_DEFINE_VALIDATE, NULL);
> @@ -929,7 +917,6 @@ static virInterfacePtr
> netcfInterfaceDefineXML(virConnectPtr conn,
>   cleanup:
>      ncf_if_free(iface);
>      VIR_FREE(xmlstr);
> -    virInterfaceDefFree(ifacedef);
>      virObjectUnlock(driver);
>      return ret;
>  }
> @@ -937,7 +924,7 @@ static virInterfacePtr
> netcfInterfaceDefineXML(virConnectPtr conn,
>  static int netcfInterfaceUndefine(virInterfacePtr ifinfo)
>  {
>      struct netcf_if *iface = NULL;
> -    virInterfaceDef *def = NULL;
> +    g_autoptr(virInterfaceDef) def = NULL;
>      int ret = -1;
>  
>      virObjectLock(driver);
> @@ -968,7 +955,6 @@ static int netcfInterfaceUndefine(virInterfacePtr
> ifinfo)
>  
>   cleanup:
>      ncf_if_free(iface);
> -    virInterfaceDefFree(def);
>      virObjectUnlock(driver);
>      return ret;
>  }
> @@ -977,7 +963,7 @@ static int netcfInterfaceCreate(virInterfacePtr
> ifinfo,
>                                  unsigned int flags)
>  {
>      struct netcf_if *iface = NULL;
> -    virInterfaceDef *def = NULL;
> +    g_autoptr(virInterfaceDef) def = NULL;
>      int ret = -1;
>      bool active;
>  
> @@ -1020,7 +1006,6 @@ static int netcfInterfaceCreate(virInterfacePtr
> ifinfo,
>  
>   cleanup:
>      ncf_if_free(iface);
> -    virInterfaceDefFree(def);
>      virObjectUnlock(driver);
>      return ret;
>  }
> @@ -1029,7 +1014,7 @@ static int
> netcfInterfaceDestroy(virInterfacePtr ifinfo,
>                                   unsigned int flags)
>  {
>      struct netcf_if *iface = NULL;
> -    virInterfaceDef *def = NULL;
> +    g_autoptr(virInterfaceDef) def = NULL;
>      int ret = -1;
>      bool active;
>  
> @@ -1072,7 +1057,6 @@ static int
> netcfInterfaceDestroy(virInterfacePtr ifinfo,
>  
>   cleanup:
>      ncf_if_free(iface);
> -    virInterfaceDefFree(def);
>      virObjectUnlock(driver);
>      return ret;
>  }
> @@ -1080,7 +1064,7 @@ static int
> netcfInterfaceDestroy(virInterfacePtr ifinfo,
>  static int netcfInterfaceIsActive(virInterfacePtr ifinfo)
>  {
>      struct netcf_if *iface = NULL;
> -    virInterfaceDef *def = NULL;
> +    g_autoptr(virInterfaceDef) def = NULL;
>      int ret = -1;
>      bool active;
>  
> @@ -1105,7 +1089,6 @@ static int
> netcfInterfaceIsActive(virInterfacePtr ifinfo)
>  
>   cleanup:
>      ncf_if_free(iface);
> -    virInterfaceDefFree(def);
>      virObjectUnlock(driver);
>      return ret;
>  }
> diff --git a/src/interface/interface_backend_udev.c
> b/src/interface/interface_backend_udev.c
> index 0217f16607..8c417714e5 100644
> --- a/src/interface/interface_backend_udev.c
> +++ b/src/interface/interface_backend_udev.c
> @@ -165,7 +165,7 @@ udevNumOfInterfacesByStatus(virConnectPtr conn,
> virUdevStatus status,
>      udev_list_entry_foreach(dev_entry, devices) {
>          struct udev_device *dev;
>          const char *path;
> -        virInterfaceDef *def;
> +        g_autoptr(virInterfaceDef) def = NULL;
>  
>          path = udev_list_entry_get_name(dev_entry);
>          dev = udev_device_new_from_syspath(udev, path);
> @@ -174,7 +174,6 @@ udevNumOfInterfacesByStatus(virConnectPtr conn,
> virUdevStatus status,
>          if (filter(conn, def))
>              count++;
>          udev_device_unref(dev);
> -        virInterfaceDefFree(def);
>      }
>  
>   cleanup:
> @@ -218,7 +217,7 @@ udevListInterfacesByStatus(virConnectPtr conn,
>      udev_list_entry_foreach(dev_entry, devices) {
>          struct udev_device *dev;
>          const char *path;
> -        virInterfaceDef *def;
> +        g_autoptr(virInterfaceDef) def = NULL;
>  
>          /* Ensure we won't exceed the size of our array */
>          if (count > names_len)
> @@ -233,7 +232,6 @@ udevListInterfacesByStatus(virConnectPtr conn,
>              count++;
>          }
>          udev_device_unref(dev);
> -        virInterfaceDefFree(def);
>      }
>  
>      udev_enumerate_unref(enumerate);
> @@ -355,7 +353,7 @@ udevConnectListAllInterfaces(virConnectPtr conn,
>          const char *path;
>          const char *name;
>          const char *macaddr;
> -        virInterfaceDef *def;
> +        g_autoptr(virInterfaceDef) def = NULL;
>  
>          path = udev_list_entry_get_name(dev_entry);
>          dev = udev_device_new_from_syspath(udev, path);
> @@ -366,10 +364,8 @@ udevConnectListAllInterfaces(virConnectPtr conn,
>          def = udevGetMinimalDefForDevice(dev);
>          if (!virConnectListAllInterfacesCheckACL(conn, def)) {
>              udev_device_unref(dev);
> -            virInterfaceDefFree(def);
>              continue;
>          }
> -        virInterfaceDefFree(def);
>  
>          /* Filter the results */
>          if (MATCH(VIR_CONNECT_LIST_INTERFACES_FILTERS_ACTIVE) &&
> @@ -413,7 +409,7 @@ udevInterfaceLookupByName(virConnectPtr conn,
> const char *name)
>      struct udev *udev = udev_ref(driver->udev);
>      struct udev_device *dev;
>      virInterfacePtr ret = NULL;
> -    virInterfaceDef *def = NULL;
> +    g_autoptr(virInterfaceDef) def = NULL;
>  
>      /* get a device reference based on the device name */
>      dev = udev_device_new_from_subsystem_sysname(udev, "net", name);
> @@ -435,7 +431,6 @@ udevInterfaceLookupByName(virConnectPtr conn,
> const char *name)
>  
>   cleanup:
>      udev_unref(udev);
> -    virInterfaceDefFree(def);
>  
>      return ret;
>  }
> @@ -447,7 +442,7 @@ udevInterfaceLookupByMACString(virConnectPtr
> conn, const char *macstr)
>      struct udev_enumerate *enumerate = NULL;
>      struct udev_list_entry *dev_entry;
>      struct udev_device *dev;
> -    virInterfaceDef *def = NULL;
> +    g_autoptr(virInterfaceDef) def = NULL;
>      virInterfacePtr ret = NULL;
>  
>      enumerate = udevGetDevices(udev, VIR_UDEV_IFACE_ALL);
> @@ -499,7 +494,6 @@ udevInterfaceLookupByMACString(virConnectPtr
> conn, const char *macstr)
>      if (enumerate)
>          udev_enumerate_unref(enumerate);
>      udev_unref(udev);
> -    virInterfaceDefFree(def);
>  
>      return ret;
>  }
> @@ -945,7 +939,7 @@ static virInterfaceDef * ATTRIBUTE_NONNULL(1)
>  udevGetIfaceDef(struct udev *udev, const char *name)
>  {
>      struct udev_device *dev = NULL;
> -    virInterfaceDef *ifacedef;
> +    g_autoptr(virInterfaceDef) ifacedef = NULL;
>      unsigned int mtu;
>      const char *mtu_str;
>      char *vlan_parent_dev = NULL;
> @@ -1038,13 +1032,11 @@ udevGetIfaceDef(struct udev *udev, const char
> *name)
>  
>      udev_device_unref(dev);
>  
> -    return ifacedef;
> +    return g_steal_pointer(&ifacedef);
>  
>   error:
>      udev_device_unref(dev);
>  
> -    virInterfaceDefFree(ifacedef);
> -
>      return NULL;
>  }
>  
> @@ -1053,7 +1045,7 @@ udevInterfaceGetXMLDesc(virInterfacePtr ifinfo,
>                          unsigned int flags)
>  {
>      struct udev *udev = udev_ref(driver->udev);
> -    virInterfaceDef *ifacedef;
> +    g_autoptr(virInterfaceDef) ifacedef = NULL;
>      char *xmlstr = NULL;
>  
>      virCheckFlags(VIR_INTERFACE_XML_INACTIVE, NULL);
> @@ -1071,8 +1063,6 @@ udevInterfaceGetXMLDesc(virInterfacePtr ifinfo,
>  
>      xmlstr = virInterfaceDefFormat(ifacedef);
>  
> -    virInterfaceDefFree(ifacedef);
> -

This used to be a memory leak if the call to
`virInterfaceGetXMLDescEnsureACL` (not shown in the patch) failed,
isn't it? If so, we should mention that in the commit message.

Otherwise:
Reviewed-by: Tim Wiederhake <twiederh@redhat.com>

>   cleanup:
>      /* decrement our udev ptr */
>      udev_unref(udev);
> @@ -1085,7 +1075,7 @@ udevInterfaceIsActive(virInterfacePtr ifinfo)
>  {
>      struct udev *udev = udev_ref(driver->udev);
>      struct udev_device *dev;
> -    virInterfaceDef *def = NULL;
> +    g_autoptr(virInterfaceDef) def = NULL;
>      int status = -1;
>  
>      dev = udev_device_new_from_subsystem_sysname(udev, "net",
> @@ -1110,7 +1100,6 @@ udevInterfaceIsActive(virInterfacePtr ifinfo)
>  
>   cleanup:
>      udev_unref(udev);
> -    virInterfaceDefFree(def);
>  
>      return status;
>  }
> diff --git a/src/test/test_driver.c b/src/test/test_driver.c
> index 13d07e570e..ea474d55ac 100644
> --- a/src/test/test_driver.c
> +++ b/src/test/test_driver.c
> @@ -1096,7 +1096,7 @@ testParseNetworks(testDriver *privconn,
>          return -1;
>  
>      for (i = 0; i < num; i++) {
> -        virNetworkDef *def;
> +        g_autoptr(virNetworkDef) def = NULL;
>          xmlNodePtr node = testParseXMLDocFromFile(nodes[i], file,
> "network");
>          if (!node)
>              return -1;
> @@ -1105,10 +1105,9 @@ testParseNetworks(testDriver *privconn,
>          if (!def)
>              return -1;
>  
> -        if (!(obj = virNetworkObjAssignDef(privconn->networks, def,
> 0))) {
> -            virNetworkDefFree(def);
> +        if (!(obj = virNetworkObjAssignDef(privconn->networks, def,
> 0)))
>              return -1;
> -        }
> +        def = NULL;
>  
>          virNetworkObjSetActive(obj, true);
>          virNetworkObjEndAPI(&obj);
> @@ -1133,7 +1132,7 @@ testParseInterfaces(testDriver *privconn,
>          return -1;
>  
>      for (i = 0; i < num; i++) {
> -        virInterfaceDef *def;
> +        g_autoptr(virInterfaceDef) def = NULL;
>          xmlNodePtr node = testParseXMLDocFromFile(nodes[i], file,
>                                                     "interface");
>          if (!node)
> @@ -1143,10 +1142,9 @@ testParseInterfaces(testDriver *privconn,
>          if (!def)
>              return -1;
>  
> -        if (!(obj = virInterfaceObjListAssignDef(privconn->ifaces,
> def))) {
> -            virInterfaceDefFree(def);
> +        if (!(obj = virInterfaceObjListAssignDef(privconn->ifaces,
> def)))
>              return -1;
> -        }
> +        def = NULL;
>  
>          virInterfaceObjSetActive(obj, true);
>          virInterfaceObjEndAPI(&obj);
> @@ -6195,7 +6193,7 @@ testInterfaceDefineXML(virConnectPtr conn,
>                         unsigned int flags)
>  {
>      testDriver *privconn = conn->privateData;
> -    virInterfaceDef *def;
> +    g_autoptr(virInterfaceDef) def = NULL;
>      virInterfaceObj *obj = NULL;
>      virInterfaceDef *objdef;
>      virInterfacePtr ret = NULL;
> @@ -6214,7 +6212,6 @@ testInterfaceDefineXML(virConnectPtr conn,
>      ret = virGetInterface(conn, objdef->name, objdef->mac);
>  
>   cleanup:
> -    virInterfaceDefFree(def);
>      virInterfaceObjEndAPI(&obj);
>      virObjectUnlock(privconn);
>      return ret;
> diff --git a/tests/interfacexml2xmltest.c
> b/tests/interfacexml2xmltest.c
> index 8235e701a9..15fab88107 100644
> --- a/tests/interfacexml2xmltest.c
> +++ b/tests/interfacexml2xmltest.c
> @@ -18,28 +18,23 @@ testCompareXMLToXMLFiles(const char *xml)
>  {
>      g_autofree char *xmlData = NULL;
>      g_autofree char *actual = NULL;
> -    int ret = -1;
> -    virInterfaceDef *dev = NULL;
> +    g_autoptr(virInterfaceDef) dev = NULL;
>  
>      if (virTestLoadFile(xml, &xmlData) < 0)
> -        goto fail;
> +        return -1;
>  
>      if (!(dev = virInterfaceDefParseString(xmlData, 0)))
> -        goto fail;
> +        return -1;
>  
>      if (!(actual = virInterfaceDefFormat(dev)))
> -        goto fail;
> +        return -1;
>  
>      if (STRNEQ(xmlData, actual)) {
>          virTestDifferenceFull(stderr, xmlData, xml, actual, NULL);
> -        goto fail;
> +        return -1;
>      }
>  
> -    ret = 0;
> -
> - fail:
> -    virInterfaceDefFree(dev);
> -    return ret;
> +    return 0;
>  }
>  
>  static int


Re: [PATCH] lib: Introduce and use g_autoptr() for virInterfaceDef
Posted by Michal Prívozník 2 years, 5 months ago
On 11/2/21 10:04 AM, Tim Wiederhake wrote:
> On Mon, 2021-11-01 at 16:25 +0100, Michal Privoznik wrote:
>> There are a lot of places where we call virInterfaceDefFree()
>> explicitly. We can define autoptr cleanup macro and annotate
>> declarations with g_autoptr() and remove plenty of those explicit
>> free calls.
>>
>> Signed-off-by: Michal Privoznik <mprivozn@redhat.com>
>> ---
>>  src/conf/interface_conf.c               | 32 ++++++++---------
>>  src/conf/interface_conf.h               |  1 +
>>  src/conf/virinterfaceobj.c              |  3 +-
>>  src/interface/interface_backend_netcf.c | 47 ++++++++---------------
>> --
>>  src/interface/interface_backend_udev.c  | 29 +++++----------
>>  src/test/test_driver.c                  | 17 ++++-----
>>  tests/interfacexml2xmltest.c            | 17 ++++-----
>>  7 files changed, 53 insertions(+), 93 deletions(-)
>>


>> diff --git a/src/conf/interface_conf.h b/src/conf/interface_conf.h
>> index ea92e0fb31..510d83b2bf 100644
>> --- a/src/conf/interface_conf.h
>> +++ b/src/conf/interface_conf.h
>> @@ -153,6 +153,7 @@ struct _virInterfaceDef {
>>  
>>  void
>>  virInterfaceDefFree(virInterfaceDef *def);
>> +G_DEFINE_AUTOPTR_CLEANUP_FUNC(virInterfaceDef, virInterfaceDefFree);
>>  
>>  virInterfaceDef *
>>  virInterfaceDefParseString(const char *xmlStr,
>> diff --git a/src/conf/virinterfaceobj.c b/src/conf/virinterfaceobj.c
>> index 9439bb3d0b..ceb3ae7595 100644
>> --- a/src/conf/virinterfaceobj.c
>> +++ b/src/conf/virinterfaceobj.c
>> @@ -362,7 +362,7 @@ virInterfaceObjListCloneCb(void *payload,
>>      virInterfaceObj *srcObj = payload;
>>      struct _virInterfaceObjListCloneData *data = opaque;
>>      char *xml = NULL;
>> -    virInterfaceDef *backup = NULL;
>> +    g_autoptr(virInterfaceDef) backup = NULL;
>>      virInterfaceObj *obj;
>>  
>>      if (data->error)
>> @@ -387,7 +387,6 @@ virInterfaceObjListCloneCb(void *payload,
>>   error:
>>      data->error = true;
>>      VIR_FREE(xml);
>> -    virInterfaceDefFree(backup);
>>      virObjectUnlock(srcObj);
>>      return 0;
>>  }
> 
> I believe there is a `g_steal_pointer` or similar missing in the call
> to `virInterfaceObjListAssignDef` (not shown in patch).

Actually, there's backup = NULL; missing right after successfull return
from virInterfaceObjListAssignDef(); just like every other call has it
(which can be then reworked to clear the pointer itself - will post a
separate patch for that shortly).

But good catch, thanks!


>> diff --git a/src/interface/interface_backend_udev.c
>> b/src/interface/interface_backend_udev.c
>> index 0217f16607..8c417714e5 100644
>> --- a/src/interface/interface_backend_udev.c
>> +++ b/src/interface/interface_backend_udev.c


>> @@ -1053,7 +1045,7 @@ udevInterfaceGetXMLDesc(virInterfacePtr ifinfo,
>>                          unsigned int flags)
>>  {
>>      struct udev *udev = udev_ref(driver->udev);
>> -    virInterfaceDef *ifacedef;
>> +    g_autoptr(virInterfaceDef) ifacedef = NULL;
>>      char *xmlstr = NULL;
>>  
>>      virCheckFlags(VIR_INTERFACE_XML_INACTIVE, NULL);
>> @@ -1071,8 +1063,6 @@ udevInterfaceGetXMLDesc(virInterfacePtr ifinfo,
>>  
>>      xmlstr = virInterfaceDefFormat(ifacedef);
>>  
>> -    virInterfaceDefFree(ifacedef);
>> -
> 
> This used to be a memory leak if the call to
> `virInterfaceGetXMLDescEnsureACL` (not shown in the patch) failed,
> isn't it? If so, we should mention that in the commit message.

Yes, let me add it there.

> 
> Otherwise:
> Reviewed-by: Tim Wiederhake <twiederh@redhat.com>
> 

Pushed, thank you.

Michal