[libvirt] [PATCH v2 09/41] util: cgroup: use VIR_AUTOFREE instead of VIR_FREE for scalar types

Sukrit Bhatnagar skrtbhtngr at gmail.com
Tue Jul 24 15:52:10 UTC 2018


By making use of GNU C's cleanup attribute handled by the
VIR_AUTOFREE macro for declaring scalar variables, majority
of the VIR_FREE calls can be dropped, which in turn leads to
getting rid of most of our cleanup sections.

Signed-off-by: Sukrit Bhatnagar <skrtbhtngr at gmail.com>
Reviewed-by: Erik Skultety <eskultet at redhat.com>
---
 src/util/vircgroup.c | 528 ++++++++++++++++++---------------------------------
 1 file changed, 181 insertions(+), 347 deletions(-)

diff --git a/src/util/vircgroup.c b/src/util/vircgroup.c
index bc5f774..6f7b5b4 100644
--- a/src/util/vircgroup.c
+++ b/src/util/vircgroup.c
@@ -162,7 +162,7 @@ virCgroupPartitionNeedsEscaping(const char *path)
 {
     FILE *fp = NULL;
     int ret = 0;
-    char *line = NULL;
+    VIR_AUTOFREE(char *) line = NULL;
     size_t buflen;
 
     /* If it starts with 'cgroup.' or a '_' of any
@@ -222,7 +222,6 @@ virCgroupPartitionNeedsEscaping(const char *path)
     }
 
  cleanup:
-    VIR_FREE(line);
     VIR_FORCE_FCLOSE(fp);
     return ret;
 }
@@ -255,41 +254,40 @@ virCgroupValidateMachineGroup(virCgroupPtr group,
                               const char *machinename)
 {
     size_t i;
-    bool valid = false;
-    char *partname = NULL;
-    char *scopename_old = NULL;
-    char *scopename_new = NULL;
-    char *partmachinename = NULL;
+    VIR_AUTOFREE(char *) partname = NULL;
+    VIR_AUTOFREE(char *) scopename_old = NULL;
+    VIR_AUTOFREE(char *) scopename_new = NULL;
+    VIR_AUTOFREE(char *) partmachinename = NULL;
 
     if (virAsprintf(&partname, "%s.libvirt-%s",
                     name, drivername) < 0)
-        goto cleanup;
+        return false;
 
     if (virCgroupPartitionEscape(&partname) < 0)
-        goto cleanup;
+        return false;
 
     if (machinename &&
         (virAsprintf(&partmachinename, "%s.libvirt-%s",
                      machinename, drivername) < 0 ||
          virCgroupPartitionEscape(&partmachinename) < 0))
-        goto cleanup;
+        return false;
 
     if (!(scopename_old = virSystemdMakeScopeName(name, drivername, true)))
-        goto cleanup;
+        return false;
 
     /* We should keep trying even if this failed */
     if (!machinename)
         virResetLastError();
     else if (!(scopename_new = virSystemdMakeScopeName(machinename,
                                                        drivername, false)))
-        goto cleanup;
+        return false;
 
     if (virCgroupPartitionEscape(&scopename_old) < 0)
-        goto cleanup;
+        return false;
 
     if (scopename_new &&
         virCgroupPartitionEscape(&scopename_new) < 0)
-        goto cleanup;
+        return false;
 
     for (i = 0; i < VIR_CGROUP_CONTROLLER_LAST; i++) {
         char *tmp;
@@ -302,7 +300,7 @@ virCgroupValidateMachineGroup(virCgroupPtr group,
 
         tmp = strrchr(group->controllers[i].placement, '/');
         if (!tmp)
-            goto cleanup;
+            return false;
 
         if (stripEmulatorSuffix &&
             (i == VIR_CGROUP_CONTROLLER_CPU ||
@@ -312,7 +310,7 @@ virCgroupValidateMachineGroup(virCgroupPtr group,
                 *tmp = '\0';
             tmp = strrchr(group->controllers[i].placement, '/');
             if (!tmp)
-                goto cleanup;
+                return false;
         }
 
         tmp++;
@@ -328,18 +326,11 @@ virCgroupValidateMachineGroup(virCgroupPtr group,
                       tmp, virCgroupControllerTypeToString(i),
                       name, NULLSTR(machinename), partname,
                       scopename_old, NULLSTR(scopename_new));
-            goto cleanup;
+            return false;
         }
     }
 
-    valid = true;
-
- cleanup:
-    VIR_FREE(partmachinename);
-    VIR_FREE(partname);
-    VIR_FREE(scopename_old);
-    VIR_FREE(scopename_new);
-    return valid;
+    return true;
 }
 
 
@@ -377,7 +368,6 @@ virCgroupDetectMountsFromFile(virCgroupPtr group,
     FILE *mounts = NULL;
     struct mntent entry;
     char buf[CGROUP_MAX_VAL];
-    char *linksrc = NULL;
     int ret = -1;
 
     mounts = fopen(path, "r");
@@ -432,8 +422,9 @@ virCgroupDetectMountsFromFile(virCgroupPtr group,
                     /* If it is a co-mount it has a filename like "cpu,cpuacct"
                      * and we must identify the symlink path */
                     if (checkLinks && strchr(tmp2 + 1, ',')) {
+                        VIR_AUTOFREE(char *) linksrc = NULL;
+
                         *tmp2 = '\0';
-                        VIR_FREE(linksrc);
                         if (virAsprintf(&linksrc, "%s/%s",
                                         entry.mnt_dir, typestr) < 0)
                             goto cleanup;
@@ -467,7 +458,6 @@ virCgroupDetectMountsFromFile(virCgroupPtr group,
 
     ret = 0;
  cleanup:
-    VIR_FREE(linksrc);
     VIR_FORCE_FCLOSE(mounts);
     return ret;
 }
@@ -546,7 +536,7 @@ virCgroupDetectPlacement(virCgroupPtr group,
     FILE *mapping  = NULL;
     char line[1024];
     int ret = -1;
-    char *procfile;
+    VIR_AUTOFREE(char *) procfile = NULL;
 
     VIR_DEBUG("Detecting placement for pid %lld path %s",
               (long long) pid, path);
@@ -627,9 +617,7 @@ virCgroupDetectPlacement(virCgroupPtr group,
     ret = 0;
 
  cleanup:
-    VIR_FREE(procfile);
     VIR_FORCE_FCLOSE(mapping);
-
     return ret;
 }
 
@@ -785,8 +773,7 @@ virCgroupSetValueStr(virCgroupPtr group,
                      const char *key,
                      const char *value)
 {
-    int ret = -1;
-    char *keypath = NULL;
+    VIR_AUTOFREE(char *) keypath = NULL;
     char *tmp = NULL;
 
     if (virCgroupPathOfController(group, controller, key, &keypath) < 0)
@@ -799,18 +786,14 @@ virCgroupSetValueStr(virCgroupPtr group,
             virReportSystemError(errno,
                                  _("Invalid value '%s' for '%s'"),
                                  value, tmp + 1);
-            goto cleanup;
+            return -1;
         }
         virReportSystemError(errno,
                              _("Unable to write to '%s'"), keypath);
-        goto cleanup;
+        return -1;
     }
 
-    ret = 0;
-
- cleanup:
-    VIR_FREE(keypath);
-    return ret;
+    return 0;
 }
 
 
@@ -820,8 +803,8 @@ virCgroupGetValueStr(virCgroupPtr group,
                      const char *key,
                      char **value)
 {
-    char *keypath = NULL;
-    int ret = -1, rc;
+    VIR_AUTOFREE(char *) keypath = NULL;
+    int rc;
 
     *value = NULL;
 
@@ -833,18 +816,14 @@ virCgroupGetValueStr(virCgroupPtr group,
     if ((rc = virFileReadAll(keypath, 1024*1024, value)) < 0) {
         virReportSystemError(errno,
                              _("Unable to read from '%s'"), keypath);
-        goto cleanup;
+        return -1;
     }
 
     /* Terminated with '\n' has sometimes harmful effects to the caller */
     if (rc > 0 && (*value)[rc - 1] == '\n')
         (*value)[rc - 1] = '\0';
 
-    ret = 0;
-
- cleanup:
-    VIR_FREE(keypath);
-    return ret;
+    return 0;
 }
 
 
@@ -855,8 +834,8 @@ virCgroupGetValueForBlkDev(virCgroupPtr group,
                            const char *path,
                            char **value)
 {
-    char *prefix = NULL;
-    char *str = NULL;
+    VIR_AUTOFREE(char *) prefix = NULL;
+    VIR_AUTOFREE(char *) str = NULL;
     char **lines = NULL;
     int ret = -1;
 
@@ -874,8 +853,6 @@ virCgroupGetValueForBlkDev(virCgroupPtr group,
 
     ret = 0;
  error:
-    VIR_FREE(str);
-    VIR_FREE(prefix);
     virStringListFree(lines);
     return ret;
 }
@@ -887,17 +864,12 @@ virCgroupSetValueU64(virCgroupPtr group,
                      const char *key,
                      unsigned long long int value)
 {
-    char *strval = NULL;
-    int ret;
+    VIR_AUTOFREE(char *) strval = NULL;
 
     if (virAsprintf(&strval, "%llu", value) < 0)
         return -1;
 
-    ret = virCgroupSetValueStr(group, controller, key, strval);
-
-    VIR_FREE(strval);
-
-    return ret;
+    return virCgroupSetValueStr(group, controller, key, strval);
 }
 
 
@@ -907,17 +879,12 @@ virCgroupSetValueI64(virCgroupPtr group,
                      const char *key,
                      long long int value)
 {
-    char *strval = NULL;
-    int ret;
+    VIR_AUTOFREE(char *) strval = NULL;
 
     if (virAsprintf(&strval, "%lld", value) < 0)
         return -1;
 
-    ret = virCgroupSetValueStr(group, controller, key, strval);
-
-    VIR_FREE(strval);
-
-    return ret;
+    return virCgroupSetValueStr(group, controller, key, strval);
 }
 
 
@@ -927,24 +894,19 @@ virCgroupGetValueI64(virCgroupPtr group,
                      const char *key,
                      long long int *value)
 {
-    char *strval = NULL;
-    int ret = -1;
+    VIR_AUTOFREE(char *) strval = NULL;
 
     if (virCgroupGetValueStr(group, controller, key, &strval) < 0)
-        goto cleanup;
+        return -1;
 
     if (virStrToLong_ll(strval, NULL, 10, value) < 0) {
         virReportError(VIR_ERR_INTERNAL_ERROR,
                        _("Unable to parse '%s' as an integer"),
                        strval);
-        goto cleanup;
+        return -1;
     }
 
-    ret = 0;
-
- cleanup:
-    VIR_FREE(strval);
-    return ret;
+    return 0;
 }
 
 
@@ -954,24 +916,19 @@ virCgroupGetValueU64(virCgroupPtr group,
                      const char *key,
                      unsigned long long int *value)
 {
-    char *strval = NULL;
-    int ret = -1;
+    VIR_AUTOFREE(char *) strval = NULL;
 
     if (virCgroupGetValueStr(group, controller, key, &strval) < 0)
-        goto cleanup;
+        return -1;
 
     if (virStrToLong_ull(strval, NULL, 10, value) < 0) {
         virReportError(VIR_ERR_INTERNAL_ERROR,
                        _("Unable to parse '%s' as an integer"),
                        strval);
-        goto cleanup;
+        return -1;
     }
 
-    ret = 0;
-
- cleanup:
-    VIR_FREE(strval);
-    return ret;
+    return 0;
 }
 
 
@@ -987,7 +944,7 @@ virCgroupCpuSetInherit(virCgroupPtr parent, virCgroupPtr group)
 
     VIR_DEBUG("Setting up inheritance %s -> %s", parent->path, group->path);
     for (i = 0; i < ARRAY_CARDINALITY(inherit_values); i++) {
-        char *value;
+        VIR_AUTOFREE(char *) value = NULL;
 
         if (virCgroupGetValueStr(parent,
                                  VIR_CGROUP_CONTROLLER_CPUSET,
@@ -1000,11 +957,8 @@ virCgroupCpuSetInherit(virCgroupPtr parent, virCgroupPtr group)
         if (virCgroupSetValueStr(group,
                                  VIR_CGROUP_CONTROLLER_CPUSET,
                                  inherit_values[i],
-                                 value) < 0) {
-            VIR_FREE(value);
+                                 value) < 0)
             return -1;
-        }
-        VIR_FREE(value);
     }
 
     return 0;
@@ -1043,11 +997,10 @@ virCgroupMakeGroup(virCgroupPtr parent,
                    unsigned int flags)
 {
     size_t i;
-    int ret = -1;
 
     VIR_DEBUG("Make group %s", group->path);
     for (i = 0; i < VIR_CGROUP_CONTROLLER_LAST; i++) {
-        char *path = NULL;
+        VIR_AUTOFREE(char *) path = NULL;
 
         /* We must never mkdir() in systemd's hierarchy */
         if (i == VIR_CGROUP_CONTROLLER_SYSTEMD) {
@@ -1073,10 +1026,8 @@ virCgroupMakeGroup(virCgroupPtr parent,
         if (!virFileExists(path)) {
             if (!create ||
                 mkdir(path, 0755) < 0) {
-                if (errno == EEXIST) {
-                    VIR_FREE(path);
+                if (errno == EEXIST)
                     continue;
-                }
                 /* With a kernel that doesn't support multi-level directory
                  * for blkio controller, libvirt will fail and disable all
                  * other controllers even though they are available. So
@@ -1084,24 +1035,20 @@ virCgroupMakeGroup(virCgroupPtr parent,
                 if (i == VIR_CGROUP_CONTROLLER_BLKIO) {
                     VIR_DEBUG("Ignoring mkdir failure with blkio controller. Kernel probably too old");
                     VIR_FREE(group->controllers[i].mountPoint);
-                    VIR_FREE(path);
                     continue;
                 } else {
                     virReportSystemError(errno,
                                          _("Failed to create controller %s for group"),
                                          virCgroupControllerTypeToString(i));
-                    VIR_FREE(path);
-                    goto cleanup;
+                    return -1;
                 }
             }
             if (group->controllers[VIR_CGROUP_CONTROLLER_CPUSET].mountPoint != NULL &&
                 (i == VIR_CGROUP_CONTROLLER_CPUSET ||
                  STREQ(group->controllers[i].mountPoint,
                        group->controllers[VIR_CGROUP_CONTROLLER_CPUSET].mountPoint))) {
-                if (virCgroupCpuSetInherit(parent, group) < 0) {
-                    VIR_FREE(path);
-                    goto cleanup;
-                }
+                if (virCgroupCpuSetInherit(parent, group) < 0)
+                    return -1;
             }
             /*
              * Note that virCgroupSetMemoryUseHierarchy should always be
@@ -1112,21 +1059,14 @@ virCgroupMakeGroup(virCgroupPtr parent,
                 (i == VIR_CGROUP_CONTROLLER_MEMORY ||
                  STREQ(group->controllers[i].mountPoint,
                        group->controllers[VIR_CGROUP_CONTROLLER_MEMORY].mountPoint))) {
-                if (virCgroupSetMemoryUseHierarchy(group) < 0) {
-                    VIR_FREE(path);
-                    goto cleanup;
-                }
+                if (virCgroupSetMemoryUseHierarchy(group) < 0)
+                    return -1;
             }
         }
-
-        VIR_FREE(path);
     }
 
     VIR_DEBUG("Done making controllers for group");
-    ret = 0;
-
- cleanup:
-    return ret;
+    return 0;
 }
 
 
@@ -1338,9 +1278,9 @@ virCgroupNewPartition(const char *path,
                       virCgroupPtr *group)
 {
     int ret = -1;
-    char *parentPath = NULL;
+    VIR_AUTOFREE(char *) parentPath = NULL;
+    VIR_AUTOFREE(char *) newPath = NULL;
     virCgroupPtr parent = NULL;
-    char *newPath = NULL;
     VIR_DEBUG("path=%s create=%d controllers=%x",
               path, create, controllers);
 
@@ -1380,8 +1320,6 @@ virCgroupNewPartition(const char *path,
     if (ret != 0)
         virCgroupFree(*group);
     virCgroupFree(parent);
-    VIR_FREE(parentPath);
-    VIR_FREE(newPath);
     return ret;
 }
 
@@ -1420,18 +1358,17 @@ virCgroupNewDomainPartition(virCgroupPtr partition,
                             bool create,
                             virCgroupPtr *group)
 {
-    int ret = -1;
-    char *grpname = NULL;
+    VIR_AUTOFREE(char *)grpname = NULL;
 
     if (virAsprintf(&grpname, "%s.libvirt-%s",
                     name, driver) < 0)
-        goto cleanup;
+        return -1;
 
     if (virCgroupPartitionEscape(&grpname) < 0)
-        goto cleanup;
+        return -1;
 
     if (virCgroupNew(-1, grpname, partition, -1, group) < 0)
-        goto cleanup;
+        return -1;
 
     /*
      * Create a cgroup with memory.use_hierarchy enabled to
@@ -1447,14 +1384,10 @@ virCgroupNewDomainPartition(virCgroupPtr partition,
                            VIR_CGROUP_MEM_HIERACHY) < 0) {
         virCgroupRemove(*group);
         virCgroupFree(*group);
-        goto cleanup;
+        return -1;
     }
 
-    ret = 0;
-
- cleanup:
-    VIR_FREE(grpname);
-    return ret;
+    return 0;
 }
 
 
@@ -1476,27 +1409,26 @@ virCgroupNewThread(virCgroupPtr domain,
                    bool create,
                    virCgroupPtr *group)
 {
-    int ret = -1;
-    char *name = NULL;
+    VIR_AUTOFREE(char *) name = NULL;
     int controllers;
 
     switch (nameval) {
     case VIR_CGROUP_THREAD_VCPU:
         if (virAsprintf(&name, "vcpu%d", id) < 0)
-            goto cleanup;
+            return -1;
         break;
     case VIR_CGROUP_THREAD_EMULATOR:
         if (VIR_STRDUP(name, "emulator") < 0)
-            goto cleanup;
+            return -1;
         break;
     case VIR_CGROUP_THREAD_IOTHREAD:
         if (virAsprintf(&name, "iothread%d", id) < 0)
-            goto cleanup;
+            return -1;
         break;
     case VIR_CGROUP_THREAD_LAST:
         virReportError(VIR_ERR_INTERNAL_ERROR,
                        _("unexpected name value %d"), nameval);
-        goto cleanup;
+        return -1;
     }
 
     controllers = ((1 << VIR_CGROUP_CONTROLLER_CPU) |
@@ -1504,18 +1436,15 @@ virCgroupNewThread(virCgroupPtr domain,
                    (1 << VIR_CGROUP_CONTROLLER_CPUSET));
 
     if (virCgroupNew(-1, name, domain, controllers, group) < 0)
-        goto cleanup;
+        return -1;
 
     if (virCgroupMakeGroup(domain, *group, create, VIR_CGROUP_NONE) < 0) {
         virCgroupRemove(*group);
         virCgroupFree(*group);
-        goto cleanup;
+        return -1;
     }
 
-    ret = 0;
- cleanup:
-    VIR_FREE(name);
-    return ret;
+    return 0;
 }
 
 
@@ -1576,7 +1505,7 @@ virCgroupNewMachineSystemd(const char *name,
     int ret = -1;
     int rv;
     virCgroupPtr init, parent = NULL;
-    char *path = NULL;
+    VIR_AUTOFREE(char *) path = NULL;
     char *offset;
 
     VIR_DEBUG("Trying to setup machine '%s' via systemd", name);
@@ -1661,7 +1590,6 @@ virCgroupNewMachineSystemd(const char *name,
     ret = 0;
  cleanup:
     virCgroupFree(parent);
-    VIR_FREE(path);
     return ret;
 }
 
@@ -1893,9 +1821,11 @@ virCgroupGetBlkioIoServiced(virCgroupPtr group,
                             long long *requests_write)
 {
     long long stats_val;
-    char *str1 = NULL, *str2 = NULL, *p1, *p2;
+    VIR_AUTOFREE(char *) str1 = NULL;
+    VIR_AUTOFREE(char *) str2 = NULL;
+    char *p1 = NULL;
+    char *p2 = NULL;
     size_t i;
-    int ret = -1;
 
     const char *value_names[] = {
         "Read ",
@@ -1918,12 +1848,12 @@ virCgroupGetBlkioIoServiced(virCgroupPtr group,
     if (virCgroupGetValueStr(group,
                              VIR_CGROUP_CONTROLLER_BLKIO,
                              "blkio.throttle.io_service_bytes", &str1) < 0)
-        goto cleanup;
+        return -1;
 
     if (virCgroupGetValueStr(group,
                              VIR_CGROUP_CONTROLLER_BLKIO,
                              "blkio.throttle.io_serviced", &str2) < 0)
-        goto cleanup;
+        return -1;
 
     /* sum up all entries of the same kind, from all devices */
     for (i = 0; i < ARRAY_CARDINALITY(value_names); i++) {
@@ -1937,7 +1867,7 @@ virCgroupGetBlkioIoServiced(virCgroupPtr group,
                                _("Cannot parse byte %sstat '%s'"),
                                value_names[i],
                                p1);
-                goto cleanup;
+                return -1;
             }
 
             if (stats_val < 0 ||
@@ -1946,7 +1876,7 @@ virCgroupGetBlkioIoServiced(virCgroupPtr group,
                 virReportError(VIR_ERR_OVERFLOW,
                                _("Sum of byte %sstat overflows"),
                                value_names[i]);
-                goto cleanup;
+                return -1;
             }
             *bytes_ptrs[i] += stats_val;
         }
@@ -1958,7 +1888,7 @@ virCgroupGetBlkioIoServiced(virCgroupPtr group,
                                _("Cannot parse %srequest stat '%s'"),
                                value_names[i],
                                p2);
-                goto cleanup;
+                return -1;
             }
 
             if (stats_val < 0 ||
@@ -1967,18 +1897,13 @@ virCgroupGetBlkioIoServiced(virCgroupPtr group,
                 virReportError(VIR_ERR_OVERFLOW,
                                _("Sum of %srequest stat overflows"),
                                value_names[i]);
-                goto cleanup;
+                return -1;
             }
             *requests_ptrs[i] += stats_val;
         }
     }
 
-    ret = 0;
-
- cleanup:
-    VIR_FREE(str2);
-    VIR_FREE(str1);
-    return ret;
+    return 0;
 }
 
 
@@ -2002,9 +1927,12 @@ virCgroupGetBlkioIoDeviceServiced(virCgroupPtr group,
                                   long long *requests_read,
                                   long long *requests_write)
 {
-    char *str1 = NULL, *str2 = NULL, *str3 = NULL, *p1, *p2;
+    VIR_AUTOFREE(char *) str1 = NULL;
+    VIR_AUTOFREE(char *) str2 = NULL;
+    VIR_AUTOFREE(char *) str3 = NULL;
+    char *p1 = NULL;
+    char *p2 = NULL;
     size_t i;
-    int ret = -1;
 
     const char *value_names[] = {
         "Read ",
@@ -2022,28 +1950,28 @@ virCgroupGetBlkioIoDeviceServiced(virCgroupPtr group,
     if (virCgroupGetValueStr(group,
                              VIR_CGROUP_CONTROLLER_BLKIO,
                              "blkio.throttle.io_service_bytes", &str1) < 0)
-        goto cleanup;
+        return -1;
 
     if (virCgroupGetValueStr(group,
                              VIR_CGROUP_CONTROLLER_BLKIO,
                              "blkio.throttle.io_serviced", &str2) < 0)
-        goto cleanup;
+        return -1;
 
     if (!(str3 = virCgroupGetBlockDevString(path)))
-        goto cleanup;
+        return -1;
 
     if (!(p1 = strstr(str1, str3))) {
         virReportError(VIR_ERR_INTERNAL_ERROR,
                        _("Cannot find byte stats for block device '%s'"),
                        str3);
-        goto cleanup;
+        return -1;
     }
 
     if (!(p2 = strstr(str2, str3))) {
         virReportError(VIR_ERR_INTERNAL_ERROR,
                        _("Cannot find request stats for block device '%s'"),
                        str3);
-        goto cleanup;
+        return -1;
     }
 
     for (i = 0; i < ARRAY_CARDINALITY(value_names); i++) {
@@ -2051,38 +1979,32 @@ virCgroupGetBlkioIoDeviceServiced(virCgroupPtr group,
             virReportError(VIR_ERR_INTERNAL_ERROR,
                            _("Cannot find byte %sstats for block device '%s'"),
                            value_names[i], str3);
-            goto cleanup;
+            return -1;
         }
 
         if (virStrToLong_ll(p1 + strlen(value_names[i]), &p1, 10, bytes_ptrs[i]) < 0) {
             virReportError(VIR_ERR_INTERNAL_ERROR,
                            _("Cannot parse %sstat '%s'"),
                            value_names[i], p1 + strlen(value_names[i]));
-            goto cleanup;
+            return -1;
         }
 
         if (!(p2 = strstr(p2, value_names[i]))) {
             virReportError(VIR_ERR_INTERNAL_ERROR,
                            _("Cannot find request %sstats for block device '%s'"),
                            value_names[i], str3);
-            goto cleanup;
+            return -1;
         }
 
         if (virStrToLong_ll(p2 + strlen(value_names[i]), &p2, 10, requests_ptrs[i]) < 0) {
             virReportError(VIR_ERR_INTERNAL_ERROR,
                            _("Cannot parse %sstat '%s'"),
                            value_names[i], p2 + strlen(value_names[i]));
-            goto cleanup;
+            return -1;
         }
     }
 
-    ret = 0;
-
- cleanup:
-    VIR_FREE(str3);
-    VIR_FREE(str2);
-    VIR_FREE(str1);
-    return ret;
+    return 0;
 }
 
 
@@ -2138,24 +2060,19 @@ virCgroupSetBlkioDeviceReadIops(virCgroupPtr group,
                                 const char *path,
                                 unsigned int riops)
 {
-    char *str = NULL;
-    char *blkstr = NULL;
-    int ret = -1;
+    VIR_AUTOFREE(char *) str = NULL;
+    VIR_AUTOFREE(char *) blkstr = NULL;
 
     if (!(blkstr = virCgroupGetBlockDevString(path)))
         return -1;
 
     if (virAsprintf(&str, "%s%u", blkstr, riops) < 0)
-        goto error;
+        return -1;
 
-    ret = virCgroupSetValueStr(group,
+    return virCgroupSetValueStr(group,
                                VIR_CGROUP_CONTROLLER_BLKIO,
                                "blkio.throttle.read_iops_device",
                                str);
- error:
-    VIR_FREE(blkstr);
-    VIR_FREE(str);
-    return ret;
 }
 
 
@@ -2172,24 +2089,19 @@ virCgroupSetBlkioDeviceWriteIops(virCgroupPtr group,
                                  const char *path,
                                  unsigned int wiops)
 {
-    char *str = NULL;
-    char *blkstr = NULL;
-    int ret = -1;
+    VIR_AUTOFREE(char *) str = NULL;
+    VIR_AUTOFREE(char *) blkstr = NULL;
 
     if (!(blkstr = virCgroupGetBlockDevString(path)))
         return -1;
 
     if (virAsprintf(&str, "%s%u", blkstr, wiops) < 0)
-        goto error;
+        return -1;
 
-    ret = virCgroupSetValueStr(group,
+    return virCgroupSetValueStr(group,
                                VIR_CGROUP_CONTROLLER_BLKIO,
                                "blkio.throttle.write_iops_device",
                                str);
- error:
-    VIR_FREE(blkstr);
-    VIR_FREE(str);
-    return ret;
 }
 
 
@@ -2206,24 +2118,19 @@ virCgroupSetBlkioDeviceReadBps(virCgroupPtr group,
                                const char *path,
                                unsigned long long rbps)
 {
-    char *str = NULL;
-    char *blkstr = NULL;
-    int ret = -1;
+    VIR_AUTOFREE(char *) str = NULL;
+    VIR_AUTOFREE(char *) blkstr = NULL;
 
     if (!(blkstr = virCgroupGetBlockDevString(path)))
         return -1;
 
     if (virAsprintf(&str, "%s%llu", blkstr, rbps) < 0)
-        goto error;
+        return -1;
 
-    ret = virCgroupSetValueStr(group,
+    return virCgroupSetValueStr(group,
                                VIR_CGROUP_CONTROLLER_BLKIO,
                                "blkio.throttle.read_bps_device",
                                str);
- error:
-    VIR_FREE(blkstr);
-    VIR_FREE(str);
-    return ret;
 }
 
 /**
@@ -2239,24 +2146,19 @@ virCgroupSetBlkioDeviceWriteBps(virCgroupPtr group,
                                 const char *path,
                                 unsigned long long wbps)
 {
-    char *str = NULL;
-    char *blkstr = NULL;
-    int ret = -1;
+    VIR_AUTOFREE(char *) str = NULL;
+    VIR_AUTOFREE(char *) blkstr = NULL;
 
     if (!(blkstr = virCgroupGetBlockDevString(path)))
         return -1;
 
     if (virAsprintf(&str, "%s%llu", blkstr, wbps) < 0)
-        goto error;
+        return -1;
 
-    ret = virCgroupSetValueStr(group,
+    return virCgroupSetValueStr(group,
                                VIR_CGROUP_CONTROLLER_BLKIO,
                                "blkio.throttle.write_bps_device",
                                str);
- error:
-    VIR_FREE(blkstr);
-    VIR_FREE(str);
-    return ret;
 }
 
 
@@ -2274,24 +2176,19 @@ virCgroupSetBlkioDeviceWeight(virCgroupPtr group,
                               const char *path,
                               unsigned int weight)
 {
-    char *str = NULL;
-    char *blkstr = NULL;
-    int ret = -1;
+    VIR_AUTOFREE(char *) str = NULL;
+    VIR_AUTOFREE(char *) blkstr = NULL;
 
     if (!(blkstr = virCgroupGetBlockDevString(path)))
         return -1;
 
     if (virAsprintf(&str, "%s%d", blkstr, weight) < 0)
-        goto error;
+        return -1;
 
-    ret = virCgroupSetValueStr(group,
+    return virCgroupSetValueStr(group,
                                VIR_CGROUP_CONTROLLER_BLKIO,
                                "blkio.weight_device",
                                str);
- error:
-    VIR_FREE(blkstr);
-    VIR_FREE(str);
-    return ret;
 }
 
 /**
@@ -2307,15 +2204,14 @@ virCgroupGetBlkioDeviceReadIops(virCgroupPtr group,
                                 const char *path,
                                 unsigned int *riops)
 {
-    char *str = NULL;
-    int ret = -1;
+    VIR_AUTOFREE(char *) str = NULL;
 
     if (virCgroupGetValueForBlkDev(group,
                                    VIR_CGROUP_CONTROLLER_BLKIO,
                                    "blkio.throttle.read_iops_device",
                                    path,
                                    &str) < 0)
-        goto error;
+        return -1;
 
     if (!str) {
         *riops = 0;
@@ -2323,13 +2219,10 @@ virCgroupGetBlkioDeviceReadIops(virCgroupPtr group,
         virReportError(VIR_ERR_INTERNAL_ERROR,
                        _("Unable to parse '%s' as an integer"),
                        str);
-        goto error;
+        return -1;
     }
 
-    ret = 0;
- error:
-    VIR_FREE(str);
-    return ret;
+    return 0;
 }
 
 /**
@@ -2345,15 +2238,14 @@ virCgroupGetBlkioDeviceWriteIops(virCgroupPtr group,
                                  const char *path,
                                  unsigned int *wiops)
 {
-    char *str = NULL;
-    int ret = -1;
+    VIR_AUTOFREE(char *) str = NULL;
 
     if (virCgroupGetValueForBlkDev(group,
                                    VIR_CGROUP_CONTROLLER_BLKIO,
                                    "blkio.throttle.write_iops_device",
                                    path,
                                    &str) < 0)
-        goto error;
+        return -1;
 
     if (!str) {
         *wiops = 0;
@@ -2361,13 +2253,10 @@ virCgroupGetBlkioDeviceWriteIops(virCgroupPtr group,
         virReportError(VIR_ERR_INTERNAL_ERROR,
                        _("Unable to parse '%s' as an integer"),
                        str);
-        goto error;
+        return -1;
     }
 
-    ret = 0;
- error:
-    VIR_FREE(str);
-    return ret;
+    return 0;
 }
 
 /**
@@ -2383,15 +2272,14 @@ virCgroupGetBlkioDeviceReadBps(virCgroupPtr group,
                                const char *path,
                                unsigned long long *rbps)
 {
-    char *str = NULL;
-    int ret = -1;
+    VIR_AUTOFREE(char *) str = NULL;
 
     if (virCgroupGetValueForBlkDev(group,
                                    VIR_CGROUP_CONTROLLER_BLKIO,
                                    "blkio.throttle.read_bps_device",
                                    path,
                                    &str) < 0)
-        goto error;
+        return -1;
 
     if (!str) {
         *rbps = 0;
@@ -2399,13 +2287,10 @@ virCgroupGetBlkioDeviceReadBps(virCgroupPtr group,
         virReportError(VIR_ERR_INTERNAL_ERROR,
                        _("Unable to parse '%s' as an integer"),
                        str);
-        goto error;
+        return -1;
     }
 
-    ret = 0;
- error:
-    VIR_FREE(str);
-    return ret;
+    return 0;
 }
 
 /**
@@ -2421,15 +2306,14 @@ virCgroupGetBlkioDeviceWriteBps(virCgroupPtr group,
                                 const char *path,
                                 unsigned long long *wbps)
 {
-    char *str = NULL;
-    int ret = -1;
+    VIR_AUTOFREE(char *) str = NULL;
 
     if (virCgroupGetValueForBlkDev(group,
                                    VIR_CGROUP_CONTROLLER_BLKIO,
                                    "blkio.throttle.write_bps_device",
                                    path,
                                    &str) < 0)
-        goto error;
+        return -1;
 
     if (!str) {
         *wbps = 0;
@@ -2437,13 +2321,10 @@ virCgroupGetBlkioDeviceWriteBps(virCgroupPtr group,
         virReportError(VIR_ERR_INTERNAL_ERROR,
                        _("Unable to parse '%s' as an integer"),
                        str);
-        goto error;
+        return -1;
     }
 
-    ret = 0;
- error:
-    VIR_FREE(str);
-    return ret;
+    return 0;
 }
 
 /**
@@ -2459,15 +2340,14 @@ virCgroupGetBlkioDeviceWeight(virCgroupPtr group,
                               const char *path,
                               unsigned int *weight)
 {
-    char *str = NULL;
-    int ret = -1;
+    VIR_AUTOFREE(char *) str = NULL;
 
     if (virCgroupGetValueForBlkDev(group,
                                    VIR_CGROUP_CONTROLLER_BLKIO,
                                    "blkio.weight_device",
                                    path,
                                    &str) < 0)
-        goto error;
+        return -1;
 
     if (!str) {
         *weight = 0;
@@ -2475,13 +2355,10 @@ virCgroupGetBlkioDeviceWeight(virCgroupPtr group,
         virReportError(VIR_ERR_INTERNAL_ERROR,
                        _("Unable to parse '%s' as an integer"),
                        str);
-        goto error;
+        return -1;
     }
 
-    ret = 0;
- error:
-    VIR_FREE(str);
-    return ret;
+    return 0;
 }
 
 
@@ -2940,36 +2817,29 @@ int
 virCgroupAllowDevice(virCgroupPtr group, char type, int major, int minor,
                      int perms)
 {
-    int ret = -1;
-    char *devstr = NULL;
-    char *majorstr = NULL;
-    char *minorstr = NULL;
+    VIR_AUTOFREE(char *) devstr = NULL;
+    VIR_AUTOFREE(char *) majorstr = NULL;
+    VIR_AUTOFREE(char *) minorstr = NULL;
 
     if ((major < 0 && VIR_STRDUP(majorstr, "*") < 0) ||
         (major >= 0 && virAsprintf(&majorstr, "%i", major) < 0))
-        goto cleanup;
+        return -1;
 
     if ((minor < 0 && VIR_STRDUP(minorstr, "*") < 0) ||
         (minor >= 0 && virAsprintf(&minorstr, "%i", minor) < 0))
-        goto cleanup;
+        return -1;
 
     if (virAsprintf(&devstr, "%c %s:%s %s", type, majorstr, minorstr,
                     virCgroupGetDevicePermsString(perms)) < 0)
-        goto cleanup;
+        return -1;
 
     if (virCgroupSetValueStr(group,
                              VIR_CGROUP_CONTROLLER_DEVICES,
                              "devices.allow",
                              devstr) < 0)
-        goto cleanup;
+        return -1;
 
-    ret = 0;
-
- cleanup:
-    VIR_FREE(devstr);
-    VIR_FREE(majorstr);
-    VIR_FREE(minorstr);
-    return ret;
+    return 0;
 }
 
 
@@ -3031,36 +2901,29 @@ int
 virCgroupDenyDevice(virCgroupPtr group, char type, int major, int minor,
                     int perms)
 {
-    int ret = -1;
-    char *devstr = NULL;
-    char *majorstr = NULL;
-    char *minorstr = NULL;
+    VIR_AUTOFREE(char *) devstr = NULL;
+    VIR_AUTOFREE(char *) majorstr = NULL;
+    VIR_AUTOFREE(char *) minorstr = NULL;
 
     if ((major < 0 && VIR_STRDUP(majorstr, "*") < 0) ||
         (major >= 0 && virAsprintf(&majorstr, "%i", major) < 0))
-        goto cleanup;
+        return -1;
 
     if ((minor < 0 && VIR_STRDUP(minorstr, "*") < 0) ||
         (minor >= 0 && virAsprintf(&minorstr, "%i", minor) < 0))
-        goto cleanup;
+        return -1;
 
     if (virAsprintf(&devstr, "%c %s:%s %s", type, majorstr, minorstr,
                     virCgroupGetDevicePermsString(perms)) < 0)
-        goto cleanup;
+        return -1;
 
     if (virCgroupSetValueStr(group,
                              VIR_CGROUP_CONTROLLER_DEVICES,
                              "devices.deny",
                              devstr) < 0)
-        goto cleanup;
+        return -1;
 
-    ret = 0;
-
- cleanup:
-    VIR_FREE(devstr);
-    VIR_FREE(majorstr);
-    VIR_FREE(minorstr);
-    return ret;
+    return 0;
 }
 
 
@@ -3130,10 +2993,10 @@ virCgroupGetPercpuVcpuSum(virCgroupPtr group,
 {
     int ret = -1;
     ssize_t i = -1;
-    char *buf = NULL;
     virCgroupPtr group_vcpu = NULL;
 
     while ((i = virBitmapNextSetBit(guestvcpus, i)) >= 0) {
+        VIR_AUTOFREE(char *) buf = NULL;
         char *pos;
         unsigned long long tmp;
         ssize_t j;
@@ -3158,13 +3021,11 @@ virCgroupGetPercpuVcpuSum(virCgroupPtr group,
         }
 
         virCgroupFree(group_vcpu);
-        VIR_FREE(buf);
     }
 
     ret = 0;
  cleanup:
     virCgroupFree(group_vcpu);
-    VIR_FREE(buf);
     return ret;
 }
 
@@ -3201,8 +3062,8 @@ virCgroupGetPercpuStats(virCgroupPtr group,
     size_t i;
     int need_cpus, total_cpus;
     char *pos;
-    char *buf = NULL;
-    unsigned long long *sum_cpu_time = NULL;
+    VIR_AUTOFREE(char *) buf = NULL;
+    VIR_AUTOFREE(unsigned long long *) sum_cpu_time = NULL;
     virTypedParameterPtr ent;
     int param_idx;
     unsigned long long cpu_time;
@@ -3288,8 +3149,6 @@ virCgroupGetPercpuStats(virCgroupPtr group,
 
  cleanup:
     virBitmapFree(cpumap);
-    VIR_FREE(sum_cpu_time);
-    VIR_FREE(buf);
     return ret;
 }
 
@@ -3460,7 +3319,7 @@ virCgroupRemoveRecursively(char *grppath)
     /* This is best-effort cleanup: we want to log failures with just
      * VIR_ERROR instead of normal virReportError */
     while ((direrr = virDirRead(grpdir, &ent, NULL)) > 0) {
-        char *path;
+        VIR_AUTOFREE(char *) path = NULL;
 
         if (ent->d_type != DT_DIR) continue;
 
@@ -3469,7 +3328,6 @@ virCgroupRemoveRecursively(char *grppath)
             break;
         }
         rc = virCgroupRemoveRecursively(path);
-        VIR_FREE(path);
         if (rc != 0)
             break;
     }
@@ -3507,10 +3365,11 @@ virCgroupRemove(virCgroupPtr group)
 {
     int rc = 0;
     size_t i;
-    char *grppath = NULL;
 
     VIR_DEBUG("Removing cgroup %s", group->path);
     for (i = 0; i < VIR_CGROUP_CONTROLLER_LAST; i++) {
+        VIR_AUTOFREE(char *) grppath = NULL;
+
         /* Skip over controllers not mounted */
         if (!group->controllers[i].mountPoint)
             continue;
@@ -3532,7 +3391,6 @@ virCgroupRemove(virCgroupPtr group)
 
         VIR_DEBUG("Removing cgroup %s and all child cgroups", grppath);
         rc = virCgroupRemoveRecursively(grppath);
-        VIR_FREE(grppath);
     }
     VIR_DEBUG("Done removing cgroup %s", group->path);
 
@@ -3548,7 +3406,7 @@ virCgroupKillInternal(virCgroupPtr group, int signum, virHashTablePtr pids)
 {
     int ret = -1;
     bool killedAny = false;
-    char *keypath = NULL;
+    VIR_AUTOFREE(char *) keypath = NULL;
     bool done = false;
     FILE *fp = NULL;
     VIR_DEBUG("group=%p path=%s signum=%d pids=%p",
@@ -3612,7 +3470,6 @@ virCgroupKillInternal(virCgroupPtr group, int signum, virHashTablePtr pids)
     ret = killedAny ? 1 : 0;
 
  cleanup:
-    VIR_FREE(keypath);
     VIR_FORCE_FCLOSE(fp);
 
     return ret;
@@ -3677,7 +3534,7 @@ virCgroupKillRecursiveInternal(virCgroupPtr group,
     int ret = -1;
     int rc;
     bool killedAny = false;
-    char *keypath = NULL;
+    VIR_AUTOFREE(char *) keypath = NULL;
     DIR *dp = NULL;
     virCgroupPtr subgroup = NULL;
     struct dirent *ent;
@@ -3731,7 +3588,6 @@ virCgroupKillRecursiveInternal(virCgroupPtr group,
 
  cleanup:
     virCgroupFree(subgroup);
-    VIR_FREE(keypath);
     VIR_DIR_CLOSE(dp);
     return ret;
 }
@@ -3845,9 +3701,8 @@ int
 virCgroupGetCpuacctStat(virCgroupPtr group, unsigned long long *user,
                         unsigned long long *sys)
 {
-    char *str;
+    VIR_AUTOFREE(char *) str = NULL;
     char *p;
-    int ret = -1;
     static double scale = -1.0;
 
     if (virCgroupGetValueStr(group, VIR_CGROUP_CONTROLLER_CPUACCT,
@@ -3859,14 +3714,14 @@ virCgroupGetCpuacctStat(virCgroupPtr group, unsigned long long *user,
         virReportError(VIR_ERR_INTERNAL_ERROR,
                        _("Cannot parse user stat '%s'"),
                        p);
-        goto cleanup;
+        return -1;
     }
     if (!(p = STRSKIP(p, "\nsystem ")) ||
         virStrToLong_ull(p, NULL, 10, sys) < 0) {
         virReportError(VIR_ERR_INTERNAL_ERROR,
                        _("Cannot parse sys stat '%s'"),
                        p);
-        goto cleanup;
+        return -1;
     }
     /* times reported are in system ticks (generally 100 Hz), but that
      * rate can theoretically vary between machines.  Scale things
@@ -3876,17 +3731,14 @@ virCgroupGetCpuacctStat(virCgroupPtr group, unsigned long long *user,
         if (ticks_per_sec == -1) {
             virReportSystemError(errno, "%s",
                                  _("Cannot determine system clock HZ"));
-            goto cleanup;
+            return -1;
         }
         scale = 1000000000.0 / ticks_per_sec;
     }
     *user *= scale;
     *sys *= scale;
 
-    ret = 0;
- cleanup:
-    VIR_FREE(str);
-    return ret;
+    return 0;
 }
 
 
@@ -3912,10 +3764,9 @@ int
 virCgroupBindMount(virCgroupPtr group, const char *oldroot,
                    const char *mountopts)
 {
-    int ret = -1;
     size_t i;
-    char *opts = NULL;
-    char *root = NULL;
+    VIR_AUTOFREE(char *) opts = NULL;
+    VIR_AUTOFREE(char *) root = NULL;
 
     if (!(root = virCgroupIdentifyRoot(group)))
         return -1;
@@ -3926,18 +3777,18 @@ virCgroupBindMount(virCgroupPtr group, const char *oldroot,
         virReportSystemError(errno,
                              _("Unable to create directory %s"),
                              root);
-        goto cleanup;
+        return -1;
     }
 
     if (virAsprintf(&opts,
                     "mode=755,size=65536%s", mountopts) < 0)
-        goto cleanup;
+        return -1;
 
     if (mount("tmpfs", root, "tmpfs", MS_NOSUID|MS_NODEV|MS_NOEXEC, opts) < 0) {
         virReportSystemError(errno,
                              _("Failed to mount %s on %s type %s"),
                              "tmpfs", root, "tmpfs");
-        goto cleanup;
+        return -1;
     }
 
     for (i = 0; i < VIR_CGROUP_CONTROLLER_LAST; i++) {
@@ -3945,11 +3796,11 @@ virCgroupBindMount(virCgroupPtr group, const char *oldroot,
             continue;
 
         if (!virFileExists(group->controllers[i].mountPoint)) {
-            char *src;
+            VIR_AUTOFREE(char *) src = NULL;
             if (virAsprintf(&src, "%s%s",
                             oldroot,
                             group->controllers[i].mountPoint) < 0)
-                goto cleanup;
+                return -1;
 
             VIR_DEBUG("Create mount point '%s'",
                       group->controllers[i].mountPoint);
@@ -3957,8 +3808,7 @@ virCgroupBindMount(virCgroupPtr group, const char *oldroot,
                 virReportSystemError(errno,
                                      _("Unable to create directory %s"),
                                      group->controllers[i].mountPoint);
-                VIR_FREE(src);
-                goto cleanup;
+                return -1;
             }
 
             if (mount(src, group->controllers[i].mountPoint, "none", MS_BIND,
@@ -3966,11 +3816,8 @@ virCgroupBindMount(virCgroupPtr group, const char *oldroot,
                 virReportSystemError(errno,
                                      _("Failed to bind cgroup '%s' on '%s'"),
                                      src, group->controllers[i].mountPoint);
-                VIR_FREE(src);
-                goto cleanup;
+                return -1;
             }
-
-            VIR_FREE(src);
         }
 
         if (group->controllers[i].linkPoint) {
@@ -3983,16 +3830,12 @@ virCgroupBindMount(virCgroupPtr group, const char *oldroot,
                                      _("Unable to symlink directory %s to %s"),
                                      group->controllers[i].mountPoint,
                                      group->controllers[i].linkPoint);
-                goto cleanup;
+                return -1;
             }
         }
     }
-    ret = 0;
 
- cleanup:
-    VIR_FREE(root);
-    VIR_FREE(opts);
-    return ret;
+    return 0;
 }
 
 
@@ -4003,11 +3846,11 @@ int virCgroupSetOwner(virCgroupPtr cgroup,
 {
     int ret = -1;
     size_t i;
-    char *base = NULL, *entry = NULL;
     DIR *dh = NULL;
     int direrr;
 
     for (i = 0; i < VIR_CGROUP_CONTROLLER_LAST; i++) {
+        VIR_AUTOFREE(char *) base = NULL;
         struct dirent *de;
 
         if (!((1 << i) & controllers))
@@ -4024,6 +3867,8 @@ int virCgroupSetOwner(virCgroupPtr cgroup,
             goto cleanup;
 
         while ((direrr = virDirRead(dh, &de, base)) > 0) {
+            VIR_AUTOFREE(char *) entry = NULL;
+
             if (virAsprintf(&entry, "%s/%s", base, de->d_name) < 0)
                 goto cleanup;
 
@@ -4033,8 +3878,6 @@ int virCgroupSetOwner(virCgroupPtr cgroup,
                                      entry, uid, gid);
                 goto cleanup;
             }
-
-            VIR_FREE(entry);
         }
         if (direrr < 0)
             goto cleanup;
@@ -4046,7 +3889,6 @@ int virCgroupSetOwner(virCgroupPtr cgroup,
             goto cleanup;
         }
 
-        VIR_FREE(base);
         VIR_DIR_CLOSE(dh);
     }
 
@@ -4054,8 +3896,6 @@ int virCgroupSetOwner(virCgroupPtr cgroup,
 
  cleanup:
     VIR_DIR_CLOSE(dh);
-    VIR_FREE(entry);
-    VIR_FREE(base);
     return ret;
 }
 
@@ -4070,8 +3910,7 @@ int virCgroupSetOwner(virCgroupPtr cgroup,
 bool
 virCgroupSupportsCpuBW(virCgroupPtr cgroup)
 {
-    char *path = NULL;
-    bool ret = false;
+    VIR_AUTOFREE(char *) path = NULL;
 
     if (!cgroup)
         return false;
@@ -4079,21 +3918,17 @@ virCgroupSupportsCpuBW(virCgroupPtr cgroup)
     if (virCgroupPathOfController(cgroup, VIR_CGROUP_CONTROLLER_CPU,
                                   "cpu.cfs_period_us", &path) < 0) {
         virResetLastError();
-        goto cleanup;
+        return false;
     }
 
-    ret = virFileExists(path);
-
- cleanup:
-    VIR_FREE(path);
-    return ret;
+    return virFileExists(path);
 }
 
 int
 virCgroupHasEmptyTasks(virCgroupPtr cgroup, int controller)
 {
     int ret = -1;
-    char *content = NULL;
+    VIR_AUTOFREE(char *) content = NULL;
 
     if (!cgroup)
         return -1;
@@ -4103,7 +3938,6 @@ virCgroupHasEmptyTasks(virCgroupPtr cgroup, int controller)
     if (ret == 0 && content[0] == '\0')
         ret = 1;
 
-    VIR_FREE(content);
     return ret;
 }
 
-- 
1.8.3.1




More information about the libvir-list mailing list