[libvirt] [PATCH v4 1/4] qemu_process.c: use g_autofree

Cole Robinson crobinso at redhat.com
Fri Dec 20 18:34:53 UTC 2019


On 12/19/19 4:09 PM, Daniel Henrique Barboza wrote:
> Change all feasible strings and scalar pointers to use g_autofree.
> 
> Signed-off-by: Daniel Henrique Barboza <danielhb413 at gmail.com>
> ---
>  src/qemu/qemu_process.c | 97 +++++++++++++++--------------------------
>  1 file changed, 34 insertions(+), 63 deletions(-)
> 
> diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c
> index 7e1db50e8f..d6d6a9f09b 100644
> --- a/src/qemu/qemu_process.c
> +++ b/src/qemu/qemu_process.c
> @@ -105,7 +105,7 @@ qemuProcessRemoveDomainStatus(virQEMUDriverPtr driver,
>                                virDomainObjPtr vm)
>  {
>      char ebuf[1024];
> -    char *file = NULL;
> +    g_autofree char *file = NULL;
>      qemuDomainObjPrivatePtr priv = vm->privateData;
>      virQEMUDriverConfigPtr cfg = virQEMUDriverGetConfig(driver);
>  
> @@ -114,7 +114,6 @@ qemuProcessRemoveDomainStatus(virQEMUDriverPtr driver,
>      if (unlink(file) < 0 && errno != ENOENT && errno != ENOTDIR)
>          VIR_WARN("Failed to remove domain XML for %s: %s",
>                   vm->def->name, virStrerror(errno, ebuf, sizeof(ebuf)));
> -    VIR_FREE(file);
>  
>      if (priv->pidfile &&
>          unlink(priv->pidfile) < 0 &&
> @@ -1501,7 +1500,7 @@ qemuProcessHandleBlockThreshold(qemuMonitorPtr mon G_GNUC_UNUSED,
>      virDomainDiskDefPtr disk;
>      virStorageSourcePtr src;
>      unsigned int idx;
> -    char *dev = NULL;
> +    g_autofree char *dev = NULL;
>      const char *path = NULL;
>  

This needs to be moved within loop scope, otherwise it will only free
once at the end of the function.

>      virObjectLock(vm);
> @@ -1514,11 +1513,9 @@ qemuProcessHandleBlockThreshold(qemuMonitorPtr mon G_GNUC_UNUSED,
>          if (virStorageSourceIsLocalStorage(src))
>              path = src->path;
>  
> -        if ((dev = qemuDomainDiskBackingStoreGetName(disk, src, idx))) {
> +        if ((dev = qemuDomainDiskBackingStoreGetName(disk, src, idx)))
>              event = virDomainEventBlockThresholdNewFromObj(vm, dev, path,
>                                                             threshold, excess);
> -            VIR_FREE(dev);
> -        }
>      }
>  
>      virObjectUnlock(vm);
> @@ -2052,7 +2049,7 @@ static int
>  qemuProcessReportLogError(qemuDomainLogContextPtr logCtxt,
>                            const char *msgprefix)
>  {
> -    char *logmsg = NULL;
> +    g_autofree char *logmsg = NULL;
>      size_t max;
>  
>      max = VIR_ERROR_MAX_LENGTH - 1;
> @@ -2069,7 +2066,6 @@ qemuProcessReportLogError(qemuDomainLogContextPtr logCtxt,
>      else
>          virReportError(VIR_ERR_INTERNAL_ERROR, _("%s: %s"), msgprefix, logmsg);
>  
> -    VIR_FREE(logmsg);
>      return 0;
>  }
>  
> @@ -2089,7 +2085,7 @@ qemuProcessLookupPTYs(virDomainChrDefPtr *devices,
>                        int count,
>                        virHashTablePtr info)
>  {
> -    char *id = NULL;
> +    g_autofree char *id = NULL;
>      size_t i;
>      int ret = -1;
>  
> @@ -2098,7 +2094,7 @@ qemuProcessLookupPTYs(virDomainChrDefPtr *devices,
>          if (chr->source->type == VIR_DOMAIN_CHR_TYPE_PTY) {
>              qemuMonitorChardevInfoPtr entry;
>  
> -            VIR_FREE(id);
> +            g_free(id);

You can move id inside loop scope as well, and then this free can be
dropped.

>              id = g_strdup_printf("char%s", chr->info.alias);
>  
>              entry = virHashLookup(info, id);
> @@ -2118,14 +2114,13 @@ qemuProcessLookupPTYs(virDomainChrDefPtr *devices,
>                  }
>              }
>  
> -            VIR_FREE(chr->source->data.file.path);
> +            g_free(chr->source->data.file.path);
>              chr->source->data.file.path = g_strdup(entry->ptyPath);
>          }
>      }
>  
>      ret = 0;
>   cleanup:
> -    VIR_FREE(id);
>      return ret;
>  }
>  
> @@ -2178,7 +2173,7 @@ qemuProcessRefreshChannelVirtioState(virQEMUDriverPtr driver,
>      int agentReason = VIR_CONNECT_DOMAIN_EVENT_AGENT_LIFECYCLE_REASON_CHANNEL;
>      qemuMonitorChardevInfoPtr entry;
>      virObjectEventPtr event = NULL;
> -    char *id = NULL;
> +    g_autofree char *id = NULL;
>  
>      if (booted)
>          agentReason = VIR_CONNECT_DOMAIN_EVENT_AGENT_LIFECYCLE_REASON_DOMAIN_STARTED;
> @@ -2204,8 +2199,6 @@ qemuProcessRefreshChannelVirtioState(virQEMUDriverPtr driver,
>              chr->state = entry->state;
>          }
>      }
> -
> -    VIR_FREE(id);
>  }
>  
>  
> @@ -2622,7 +2615,7 @@ qemuProcessSetupPid(virDomainObjPtr vm,
>      virBitmapPtr use_cpumask = NULL;
>      virBitmapPtr afinity_cpumask = NULL;
>      g_autoptr(virBitmap) hostcpumap = NULL;
> -    char *mem_mask = NULL;
> +    g_autofree char *mem_mask = NULL;
>      int ret = -1;
>  
>      if ((period || quota) &&
> @@ -2702,7 +2695,6 @@ qemuProcessSetupPid(virDomainObjPtr vm,
>  
>      ret = 0;
>   cleanup:
> -    VIR_FREE(mem_mask);
>      if (cgroup) {
>          if (ret < 0)
>              virCgroupRemove(cgroup);
> @@ -2781,7 +2773,7 @@ qemuProcessKillManagedPRDaemon(virDomainObjPtr vm)
>  {
>      qemuDomainObjPrivatePtr priv = vm->privateData;
>      virErrorPtr orig_err;
> -    char *pidfile;
> +    g_autofree char *pidfile = NULL;
>  
>      if (!(pidfile = qemuProcessBuildPRHelperPidfilePath(vm))) {
>          VIR_WARN("Unable to construct pr-helper pidfile path");
> @@ -2802,8 +2794,6 @@ qemuProcessKillManagedPRDaemon(virDomainObjPtr vm)
>          }
>      }
>      virErrorRestore(&orig_err);
> -
> -    VIR_FREE(pidfile);
>  }
>  
>  
> @@ -2812,7 +2802,7 @@ qemuProcessStartPRDaemonHook(void *opaque)
>  {
>      virDomainObjPtr vm = opaque;
>      size_t i, nfds = 0;
> -    int *fds = NULL;
> +    g_autofree int *fds = NULL;
>      int ret = -1;
>  
>      if (qemuDomainNamespaceEnabled(vm, QEMU_DOMAIN_NS_MOUNT)) {
> @@ -2828,7 +2818,6 @@ qemuProcessStartPRDaemonHook(void *opaque)
>   cleanup:
>      for (i = 0; i < nfds; i++)
>          VIR_FORCE_CLOSE(fds[i]);
> -    VIR_FREE(fds);
>      return ret;
>  }
>  
> @@ -2840,9 +2829,9 @@ qemuProcessStartManagedPRDaemon(virDomainObjPtr vm)
>      virQEMUDriverPtr driver = priv->driver;
>      virQEMUDriverConfigPtr cfg;
>      int errfd = -1;
> -    char *pidfile = NULL;
> +    g_autofree char *pidfile = NULL;
>      int pidfd = -1;
> -    char *socketPath = NULL;
> +    g_autofree char *socketPath = NULL;
>      pid_t cpid = -1;
>      virCommandPtr cmd = NULL;
>      virTimeBackOffVar timebackoff;
> @@ -2948,9 +2937,7 @@ qemuProcessStartManagedPRDaemon(virDomainObjPtr vm)
>              unlink(pidfile);
>      }
>      virCommandFree(cmd);
> -    VIR_FREE(socketPath);
>      VIR_FORCE_CLOSE(pidfd);
> -    VIR_FREE(pidfile);
>      VIR_FORCE_CLOSE(errfd);
>      virObjectUnref(cfg);
>      return ret;
> @@ -3366,7 +3353,7 @@ qemuProcessUpdateState(virQEMUDriverPtr driver, virDomainObjPtr vm)
>      int oldReason;
>      int newReason;
>      bool running;
> -    char *msg = NULL;
> +    g_autofree char *msg = NULL;
>      int ret;
>  
>      qemuDomainObjEnterMonitor(driver, vm);
> @@ -3414,7 +3401,6 @@ qemuProcessUpdateState(virQEMUDriverPtr driver, virDomainObjPtr vm)
>                    NULLSTR(msg),
>                    virDomainStateTypeToString(newState),
>                    virDomainStateReasonToString(newState, newReason));
> -        VIR_FREE(msg);
>          virDomainObjSetState(vm, newState, newReason);
>      }
>  
> @@ -3879,7 +3865,7 @@ qemuProcessBuildDestroyMemoryPaths(virQEMUDriverPtr driver,
>                                     bool build)
>  {
>      virQEMUDriverConfigPtr cfg = virQEMUDriverGetConfig(driver);
> -    char *path = NULL;
> +    g_autofree char *path = NULL;
>      size_t i;
>      bool shouldBuildHP = false;
>      bool shouldBuildMB = false;
> @@ -3912,13 +3898,10 @@ qemuProcessBuildDestroyMemoryPaths(virQEMUDriverPtr driver,
>          if (qemuProcessBuildDestroyMemoryPathsImpl(driver, vm,
>                                                     path, build) < 0)
>              goto cleanup;
> -
> -        VIR_FREE(path);
>      }
>  

I think this function should get g_autofree char *path = NULL; in both
the loop, and the second conditional, then all the free'ing can be dropped

>      ret = 0;
>   cleanup:
> -    VIR_FREE(path);
>      virObjectUnref(cfg);
>      return ret;
>  }
> @@ -3930,7 +3913,7 @@ qemuProcessDestroyMemoryBackingPath(virQEMUDriverPtr driver,
>                                      virDomainMemoryDefPtr mem)
>  {
>      virQEMUDriverConfigPtr cfg = virQEMUDriverGetConfig(driver);
> -    char *path = NULL;
> +    g_autofree char *path = NULL;
>      int ret = -1;
>  
>      if (qemuGetMemoryBackingPath(vm->def, cfg, mem->info.alias, &path) < 0)
> @@ -3944,7 +3927,6 @@ qemuProcessDestroyMemoryBackingPath(virQEMUDriverPtr driver,
>  
>      ret = 0;
>   cleanup:
> -    VIR_FREE(path);
>      virObjectUnref(cfg);
>      return ret;
>  }
> @@ -4079,11 +4061,12 @@ static int
>  qemuProcessVerifyHypervFeatures(virDomainDefPtr def,
>                                  virCPUDataPtr cpu)
>  {
> -    char *cpuFeature;
>      size_t i;
>      int rc;
>  
>      for (i = 0; i < VIR_DOMAIN_HYPERV_LAST; i++) {
> +        g_autofree char *cpuFeature = NULL;
> +
>          /* always supported string property */
>          if (i == VIR_DOMAIN_HYPERV_VENDOR_ID ||
>              i == VIR_DOMAIN_HYPERV_SPINLOCKS)
> @@ -4095,7 +4078,6 @@ qemuProcessVerifyHypervFeatures(virDomainDefPtr def,
>          cpuFeature = g_strdup_printf("hv-%s", virDomainHypervTypeToString(i));
>  
>          rc = virCPUDataCheckFeature(cpu, cpuFeature);
> -        VIR_FREE(cpuFeature);
>  
>          if (rc < 0) {
>              return -1;
> @@ -4518,17 +4500,17 @@ qemuLogOperation(virDomainObjPtr vm,
>                   virCommandPtr cmd,
>                   qemuDomainLogContextPtr logCtxt)
>  {
> -    char *timestamp;
> +    g_autofree char *timestamp = NULL;
>      qemuDomainObjPrivatePtr priv = vm->privateData;
>      int qemuVersion = virQEMUCapsGetVersion(priv->qemuCaps);
>      const char *package = virQEMUCapsGetPackage(priv->qemuCaps);
> -    char *hostname = virGetHostname();
> +    g_autofree char *hostname = virGetHostname();
>      struct utsname uts;
>  
>      uname(&uts);
>  
>      if ((timestamp = virTimeStringNow()) == NULL)
> -        goto cleanup;
> +        return;
>  
>      if (qemuDomainLogContextWrite(logCtxt,
>                                    "%s: %s %s, qemu version: %d.%d.%d%s, kernel: %s, hostname: %s\n",
> @@ -4539,17 +4521,12 @@ qemuLogOperation(virDomainObjPtr vm,
>                                    NULLSTR_EMPTY(package),
>                                    uts.release,
>                                    NULLSTR_EMPTY(hostname)) < 0)
> -        goto cleanup;
> +        return;
>  
>      if (cmd) {
> -        char *args = virCommandToString(cmd, true);
> +        g_autofree char *args = virCommandToString(cmd, true);
>          qemuDomainLogContextWrite(logCtxt, "%s\n", args);
> -        VIR_FREE(args);
>      }
> -
> - cleanup:
> -    VIR_FREE(hostname);
> -    VIR_FREE(timestamp);
>  }
>  
>  
> @@ -4647,7 +4624,7 @@ qemuProcessStartHook(virQEMUDriverPtr driver,
>                       virHookSubopType subop)
>  {
>      qemuDomainObjPrivatePtr priv = vm->privateData;
> -    char *xml;
> +    g_autofree char *xml = NULL;
>      int ret;
>  
>      if (!virHookPresent(VIR_HOOK_DRIVER_QEMU))
> @@ -4658,7 +4635,6 @@ qemuProcessStartHook(virQEMUDriverPtr driver,
>  
>      ret = virHookCall(VIR_HOOK_DRIVER_QEMU, vm->def->name, op, subop,
>                        NULL, xml, NULL);
> -    VIR_FREE(xml);
>  
>      return ret;
>  }
> @@ -4771,7 +4747,7 @@ qemuProcessGetNetworkAddress(const char *netname,
>      virSocketAddr addr;
>      virSocketAddrPtr addrptr = NULL;
>      char *dev_name = NULL;
> -    char *xml = NULL;
> +    g_autofree char *xml = NULL;
>  
>      *netaddr = NULL;
>  
> @@ -4853,7 +4829,6 @@ qemuProcessGetNetworkAddress(const char *netname,
>      virNetworkDefFree(netdef);
>      virObjectUnref(net);
>      virObjectUnref(conn);
> -    VIR_FREE(xml);
>      return ret;
>  }
>  
> @@ -6392,7 +6367,7 @@ qemuProcessSEVCreateFile(virDomainObjPtr vm,
>  {
>      qemuDomainObjPrivatePtr priv = vm->privateData;
>      virQEMUDriverPtr driver = priv->driver;
> -    char *configFile;
> +    g_autofree char *configFile = NULL;
>      int ret = -1;
>  
>      if (!(configFile = virFileBuildPath(priv->libDir, name, ".base64")))
> @@ -6409,7 +6384,6 @@ qemuProcessSEVCreateFile(virDomainObjPtr vm,
>  
>      ret = 0;
>   cleanup:
> -    VIR_FREE(configFile);
>      return ret;
>  }
>  
> @@ -6746,7 +6720,7 @@ qemuProcessLaunch(virConnectPtr conn,
>      struct qemuProcessHookData hookData;
>      virQEMUDriverConfigPtr cfg;
>      size_t nnicindexes = 0;
> -    int *nicindexes = NULL;
> +    g_autofree int *nicindexes = NULL;
>      size_t i;
>  
>      VIR_DEBUG("conn=%p driver=%p vm=%p name=%s if=%d asyncJob=%d "
> @@ -7053,7 +7027,6 @@ qemuProcessLaunch(virConnectPtr conn,
>      virCommandFree(cmd);
>      virObjectUnref(logCtxt);
>      virObjectUnref(cfg);
> -    VIR_FREE(nicindexes);
>      return ret;
>  }
>  
> @@ -7374,7 +7347,7 @@ void qemuProcessStop(virQEMUDriverPtr driver,
>      virDomainDefPtr def = vm->def;
>      const virNetDevVPortProfile *vport = NULL;
>      size_t i;
> -    char *timestamp;
> +    g_autofree char *timestamp = NULL;
>      virQEMUDriverConfigPtr cfg = virQEMUDriverGetConfig(driver);
>      virConnectPtr conn = NULL;
>  
> @@ -7417,7 +7390,6 @@ void qemuProcessStop(virQEMUDriverPtr driver,
>          qemuDomainLogAppendMessage(driver, vm, "%s: shutting down, reason=%s\n",
>                                     timestamp,
>                                     virDomainShutoffReasonTypeToString(reason));
> -        VIR_FREE(timestamp);
>      }
>  
>      /* Clear network bandwidth */
> @@ -7488,13 +7460,12 @@ void qemuProcessStop(virQEMUDriverPtr driver,
>  
>      /* now that we know it's stopped call the hook if present */
>      if (virHookPresent(VIR_HOOK_DRIVER_QEMU)) {
> -        char *xml = qemuDomainDefFormatXML(driver, NULL, vm->def, 0);
> +        g_autofree char *xml = qemuDomainDefFormatXML(driver, NULL, vm->def, 0);
>  
>          /* we can't stop the operation even if the script raised an error */
>          ignore_value(virHookCall(VIR_HOOK_DRIVER_QEMU, vm->def->name,
>                                   VIR_HOOK_QEMU_OP_STOPPED, VIR_HOOK_SUBOP_END,
>                                   NULL, xml, NULL));
> -        VIR_FREE(xml);
>      }
>  
>      /* Reset Security Labels unless caller don't want us to */
> @@ -7677,13 +7648,12 @@ void qemuProcessStop(virQEMUDriverPtr driver,
>  
>      /* The "release" hook cleans up additional resources */
>      if (virHookPresent(VIR_HOOK_DRIVER_QEMU)) {
> -        char *xml = qemuDomainDefFormatXML(driver, NULL, vm->def, 0);
> +        g_autofree char *xml = qemuDomainDefFormatXML(driver, NULL, vm->def, 0);
>  
>          /* we can't stop the operation even if the script raised an error */
>          virHookCall(VIR_HOOK_DRIVER_QEMU, vm->def->name,
>                      VIR_HOOK_QEMU_OP_RELEASE, VIR_HOOK_SUBOP_END,
>                      NULL, xml, NULL);
> -        VIR_FREE(xml);
>      }
>  
>      virDomainObjRemoveTransientDef(vm);
> @@ -8228,13 +8198,14 @@ qemuProcessReconnect(void *opaque)
>  
>      /* Run an hook to allow admins to do some magic */
>      if (virHookPresent(VIR_HOOK_DRIVER_QEMU)) {
> -        char *xml = qemuDomainDefFormatXML(driver, priv->qemuCaps, obj->def, 0);
> +        g_autofree char *xml = qemuDomainDefFormatXML(driver,
> +                                                          priv->qemuCaps,
> +                                                          obj->def, 0);
>          int hookret;
>  
>          hookret = virHookCall(VIR_HOOK_DRIVER_QEMU, obj->def->name,
>                                VIR_HOOK_QEMU_OP_RECONNECT, VIR_HOOK_SUBOP_BEGIN,
>                                NULL, xml, NULL);
> -        VIR_FREE(xml);
>  
>          /*
>           * If the script raised an error abort the launch
> @@ -8489,7 +8460,7 @@ qemuProcessQEMULabelUniqPath(qemuProcessQMPPtr proc)
>  static int
>  qemuProcessQMPInit(qemuProcessQMPPtr proc)
>  {
> -    char *template = NULL;
> +    g_autofree char *template = NULL;
>  
>      VIR_DEBUG("proc=%p, emulator=%s", proc, proc->binary);
>  
> 

Last one looks suspicious, either it's fixing a memory leak or something
is wrong! It's a bit of both. Later code is:


    template = g_strdup_printf("%s/qmp-XXXXXX", proc->libDir);

    if (!(proc->uniqDir = g_mkdtemp(template))) {

        virReportSystemError(errno,

                             _("Failed to create unique directory with "

                               "template '%s' for probing QEMU"),

                             template);

        return -1;

    }

g_mkdtemp actually alters and returns the passed in string, it doesn't
return new memory. So if g_mkdtemp succeeds, we are transfering
ownership to proc->uniqDir. There's a bug though that template isn't
free'd if g_mkdtemp fails.

So if you convert to g_autofree, after g_mkdtemp succeeds, you need to
set 'template = NULL';

- Cole




More information about the libvir-list mailing list