[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