[PATCH 04/11] src: Declare and use g_autoptr(virConfValue)

Michal Privoznik mprivozn at redhat.com
Fri Jan 14 14:39:48 UTC 2022


This commit declares g_autoptr() function for virConfValue type.
At the same time, it switches variable declarations to use it.
Also, in a few places we might have freed a variable twice, for
instance in xenFormatXLDomainNamespaceData(). This is because
virConfSetValue() consumes passed pointer (@value) even in case
of failure and thus any code that uses virConfSetValue() must
refrain from touching @value and it must not call
virConfFreeValue().

This semantic is not obvious and will be addressed in one of
future commits.

Signed-off-by: Michal Privoznik <mprivozn at redhat.com>
---
 src/libxl/xen_common.c | 28 +++++++++++++---------------
 src/libxl/xen_xl.c     | 36 +++++++++++++-----------------------
 src/libxl/xen_xm.c     |  4 +---
 src/util/virconf.h     |  1 +
 4 files changed, 28 insertions(+), 41 deletions(-)

diff --git a/src/libxl/xen_common.c b/src/libxl/xen_common.c
index e68ca1cde3..f36e269aab 100644
--- a/src/libxl/xen_common.c
+++ b/src/libxl/xen_common.c
@@ -1729,7 +1729,7 @@ xenFormatNet(virConnectPtr conn,
 static int
 xenFormatPCI(virConf *conf, virDomainDef *def)
 {
-    virConfValue *pciVal = NULL;
+    g_autoptr(virConfValue) pciVal = NULL;
     int hasPCI = 0;
     size_t i;
 
@@ -1794,7 +1794,6 @@ xenFormatPCI(virConf *conf, virDomainDef *def)
         if (ret < 0)
             return -1;
     }
-    VIR_FREE(pciVal);
 
     return 0;
 }
@@ -1970,7 +1969,7 @@ xenFormatCharDev(virConf *conf, virDomainDef *def,
             } else {
                 size_t j = 0;
                 int maxport = -1, port;
-                virConfValue *serialVal = NULL;
+                g_autoptr(virConfValue) serialVal = NULL;
 
                 if (STREQ(nativeFormat, XEN_CONFIG_FORMAT_XM)) {
                     virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
@@ -1997,7 +1996,6 @@ xenFormatCharDev(virConf *conf, virDomainDef *def,
                     }
 
                     if (xenFormatSerial(serialVal, chr) < 0) {
-                        VIR_FREE(serialVal);
                         return -1;
                     }
                 }
@@ -2009,7 +2007,6 @@ xenFormatCharDev(virConf *conf, virDomainDef *def,
                     if (ret < 0)
                         return -1;
                 }
-                VIR_FREE(serialVal);
             }
         } else {
             if (xenConfigSetString(conf, "serial", "none") < 0)
@@ -2224,8 +2221,8 @@ xenFormatVfb(virConf *conf, virDomainDef *def)
                     return -1;
             }
         } else {
-            virConfValue *vfb;
-            virConfValue *disp;
+            g_autoptr(virConfValue) vfb = NULL;
+            g_autoptr(virConfValue) disp = NULL;
             char *vfbstr = NULL;
             g_auto(virBuffer) buf = VIR_BUFFER_INITIALIZER;
 
@@ -2259,16 +2256,19 @@ xenFormatVfb(virConf *conf, virDomainDef *def)
 
             vfbstr = virBufferContentAndReset(&buf);
 
-            vfb = g_new0(virConfValue, 1);
             disp = g_new0(virConfValue, 1);
-
-            vfb->type = VIR_CONF_LIST;
-            vfb->list = disp;
             disp->type = VIR_CONF_STRING;
             disp->str = vfbstr;
 
-            if (virConfSetValue(conf, "vfb", vfb) < 0)
+            vfb = g_new0(virConfValue, 1);
+            vfb->type = VIR_CONF_LIST;
+            vfb->list = g_steal_pointer(&disp);
+
+            if (virConfSetValue(conf, "vfb", vfb) < 0) {
+                vfb = NULL;
                 return -1;
+            }
+            vfb = NULL;
         }
     }
 
@@ -2312,7 +2312,7 @@ xenFormatVif(virConf *conf,
              virDomainDef *def,
              const char *vif_typename)
 {
-    virConfValue *netVal = NULL;
+    g_autoptr(virConfValue) netVal = NULL;
     size_t i;
     int hvm = def->os.type == VIR_DOMAIN_OSTYPE_HVM;
 
@@ -2333,11 +2333,9 @@ xenFormatVif(virConf *conf,
             goto cleanup;
     }
 
-    VIR_FREE(netVal);
     return 0;
 
  cleanup:
-    virConfFreeValue(netVal);
     return -1;
 }
 
diff --git a/src/libxl/xen_xl.c b/src/libxl/xen_xl.c
index e3ddae8827..815c1216f7 100644
--- a/src/libxl/xen_xl.c
+++ b/src/libxl/xen_xl.c
@@ -1429,7 +1429,7 @@ xenFormatXLDomainVnuma(virConf *conf,
                        virDomainDef *def)
 {
     virDomainNuma *numa = def->numa;
-    virConfValue *vnumaVal;
+    g_autoptr(virConfValue) vnumaVal = NULL;
     size_t i;
     size_t nr_nodes;
 
@@ -1453,12 +1453,10 @@ xenFormatXLDomainVnuma(virConf *conf,
             if (ret < 0)
                 return -1;
     }
-    VIR_FREE(vnumaVal);
 
     return 0;
 
  cleanup:
-    virConfFreeValue(vnumaVal);
     return -1;
 }
 
@@ -1683,7 +1681,7 @@ xenFormatXLDisk(virConfValue *list, virDomainDiskDef *disk)
 static int
 xenFormatXLDomainDisks(virConf *conf, virDomainDef *def)
 {
-    virConfValue *diskVal;
+    g_autoptr(virConfValue) diskVal = NULL;
     size_t i;
 
     diskVal = g_new0(virConfValue, 1);
@@ -1705,12 +1703,10 @@ xenFormatXLDomainDisks(virConf *conf, virDomainDef *def)
         if (ret < 0)
             return -1;
     }
-    VIR_FREE(diskVal);
 
     return 0;
 
  cleanup:
-    virConfFreeValue(diskVal);
     return -1;
 }
 
@@ -1807,7 +1803,7 @@ xenFormatXLInputDevs(virConf *conf, virDomainDef *def)
 {
     size_t i;
     const char *devtype;
-    virConfValue *usbdevices = NULL;
+    g_autoptr(virConfValue) usbdevices = NULL;
     virConfValue *lastdev;
 
     if (def->os.type == VIR_DOMAIN_OSTYPE_HVM) {
@@ -1851,7 +1847,6 @@ xenFormatXLInputDevs(virConf *conf, virDomainDef *def)
                  * only one device present */
                 if (xenConfigSetString(conf, "usbdevice", usbdevices->list->str) < 0)
                     goto error;
-                virConfFreeValue(usbdevices);
             } else {
                 if (virConfSetValue(conf, "usbdevice", usbdevices) < 0) {
                     usbdevices = NULL;
@@ -1859,14 +1854,11 @@ xenFormatXLInputDevs(virConf *conf, virDomainDef *def)
                 }
                 usbdevices = NULL;
             }
-        } else {
-            VIR_FREE(usbdevices);
         }
     }
 
     return 0;
  error:
-    virConfFreeValue(usbdevices);
     return -1;
 }
 
@@ -1874,7 +1866,7 @@ static int
 xenFormatXLUSBController(virConf *conf,
                          virDomainDef *def)
 {
-    virConfValue *usbctrlVal = NULL;
+    g_autoptr(virConfValue) usbctrlVal = NULL;
     int hasUSBCtrl = 0;
     size_t i;
 
@@ -1937,12 +1929,10 @@ xenFormatXLUSBController(virConf *conf,
         if (ret < 0)
             return -1;
     }
-    VIR_FREE(usbctrlVal);
 
     return 0;
 
  error:
-    virConfFreeValue(usbctrlVal);
     return -1;
 }
 
@@ -1951,7 +1941,7 @@ static int
 xenFormatXLUSB(virConf *conf,
                virDomainDef *def)
 {
-    virConfValue *usbVal = NULL;
+    g_autoptr(virConfValue) usbVal = NULL;
     int hasUSB = 0;
     size_t i;
 
@@ -2001,7 +1991,6 @@ xenFormatXLUSB(virConf *conf,
         if (ret < 0)
             return -1;
     }
-    VIR_FREE(usbVal);
 
     return 0;
 }
@@ -2050,7 +2039,7 @@ xenFormatXLChannel(virConfValue *list, virDomainChrDef *channel)
 static int
 xenFormatXLDomainChannels(virConf *conf, virDomainDef *def)
 {
-    virConfValue *channelVal = NULL;
+    g_autoptr(virConfValue) channelVal = NULL;
     size_t i;
 
     channelVal = g_new0(virConfValue, 1);
@@ -2075,11 +2064,9 @@ xenFormatXLDomainChannels(virConf *conf, virDomainDef *def)
             goto cleanup;
     }
 
-    VIR_FREE(channelVal);
     return 0;
 
  cleanup:
-    virConfFreeValue(channelVal);
     return -1;
 }
 
@@ -2087,7 +2074,7 @@ static int
 xenFormatXLDomainNamespaceData(virConf *conf, virDomainDef *def)
 {
     libxlDomainXmlNsDef *nsdata = def->namespaceData;
-    virConfValue *args = NULL;
+    g_autoptr(virConfValue) args = NULL;
     size_t i;
 
     if (!nsdata)
@@ -2118,14 +2105,17 @@ xenFormatXLDomainNamespaceData(virConf *conf, virDomainDef *def)
             args->list = val;
     }
 
-    if (args->list != NULL)
-        if (virConfSetValue(conf, "device_model_args", args) < 0)
+    if (args->list != NULL) {
+        if (virConfSetValue(conf, "device_model_args", args) < 0) {
+            args = NULL;
             goto error;
+        }
+        args = NULL;
+    }
 
     return 0;
 
  error:
-    virConfFreeValue(args);
     return -1;
 }
 
diff --git a/src/libxl/xen_xm.c b/src/libxl/xen_xm.c
index 9c2d091918..b8f0471514 100644
--- a/src/libxl/xen_xm.c
+++ b/src/libxl/xen_xm.c
@@ -340,7 +340,7 @@ xenFormatXMDisk(virConfValue *list,
 static int
 xenFormatXMDisks(virConf *conf, virDomainDef *def)
 {
-    virConfValue *diskVal = NULL;
+    g_autoptr(virConfValue) diskVal = NULL;
     size_t i = 0;
 
     diskVal = g_new0(virConfValue, 1);
@@ -362,12 +362,10 @@ xenFormatXMDisks(virConf *conf, virDomainDef *def)
         if (ret < 0)
             goto cleanup;
     }
-    VIR_FREE(diskVal);
 
     return 0;
 
  cleanup:
-    virConfFreeValue(diskVal);
     return -1;
 }
 
diff --git a/src/util/virconf.h b/src/util/virconf.h
index 937e5d43ed..558009b92e 100644
--- a/src/util/virconf.h
+++ b/src/util/virconf.h
@@ -78,6 +78,7 @@ virConf *virConfReadString(const char *memory,
 int virConfFree(virConf *conf);
 G_DEFINE_AUTOPTR_CLEANUP_FUNC(virConf, virConfFree);
 void virConfFreeValue(virConfValue *val);
+G_DEFINE_AUTOPTR_CLEANUP_FUNC(virConfValue, virConfFreeValue);
 virConfValue *virConfGetValue(virConf *conf,
                                 const char *setting);
 
-- 
2.34.1




More information about the libvir-list mailing list