From 1825c6555a2e8c73b657c031072957297bc82840 Mon Sep 17 00:00:00 2001 From: Jim Meyering Date: Wed, 20 Jan 2010 19:27:43 +0100 Subject: [PATCH] domain_conf.c: avoid a leak and the need for "cleanup:" block * src/conf/domain_conf.c (virDomainChrDefFormat): Plug a leak on an error path, and at the same time, eliminate the need for a "cleanup:" block. Before, the "return -1" after the switch would leak an "addr" string. Now, by reversing the port,addr- getting blocks we can free "addr" immediately and skip the goto. --- src/conf/domain_conf.c | 43 ++++++++++++++++++++---------------------- 1 file changed, 20 insertions(+), 23 deletions(-) diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index 6254dc85e4..27f6f845a2 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -1,7 +1,7 @@ /* * domain_conf.c: domain XML processing * - * Copyright (C) 2006-2009 Red Hat, Inc. + * Copyright (C) 2006-2010 Red Hat, Inc. * Copyright (C) 2006-2008 Daniel P. Berrange * * This library is free software; you can redistribute it and/or @@ -4831,7 +4831,6 @@ virDomainChrDefFormat(virConnectPtr conn, const char *targetName = virDomainChrTargetTypeToString(def->targetType); const char *elementName; - const char *addr = NULL; int ret = 0; switch (def->targetType) { @@ -4847,8 +4846,7 @@ virDomainChrDefFormat(virConnectPtr conn, if (!type) { virDomainReportError(conn, VIR_ERR_INTERNAL_ERROR, _("unexpected char type %d"), def->type); - ret = -1; - goto cleanup; + return -1; } /* Compat with legacy syntax */ @@ -4931,23 +4929,25 @@ virDomainChrDefFormat(virConnectPtr conn, switch (def->targetType) { case VIR_DOMAIN_CHR_TARGET_TYPE_GUESTFWD: - addr = virSocketFormatAddr(def->target.addr); - if (addr == NULL) { - virDomainReportError(conn, VIR_ERR_INTERNAL_ERROR, "%s", - _("Unable to format guestfwd address")); - ret = -1; - goto cleanup; - } - int port = virSocketGetPort(def->target.addr); - if (port < 0) { - virDomainReportError(conn, VIR_ERR_INTERNAL_ERROR, "%s", - _("Unable to format guestfwd port")); - ret = -1; - goto cleanup; + { + int port = virSocketGetPort(def->target.addr); + if (port < 0) { + virDomainReportError(conn, VIR_ERR_INTERNAL_ERROR, "%s", + _("Unable to format guestfwd port")); + return -1; + } + const char *addr = virSocketFormatAddr(def->target.addr); + if (addr == NULL) { + virDomainReportError(conn, VIR_ERR_INTERNAL_ERROR, "%s", + _("Unable to format guestfwd address")); + return -1; + } + virBufferVSprintf(buf, + " \n", + addr, port); + VIR_FREE(addr); + break; } - virBufferVSprintf(buf, " \n", - addr, port); - break; case VIR_DOMAIN_CHR_TARGET_TYPE_PARALLEL: case VIR_DOMAIN_CHR_TARGET_TYPE_SERIAL: @@ -4969,9 +4969,6 @@ virDomainChrDefFormat(virConnectPtr conn, virBufferVSprintf(buf, " \n", elementName); -cleanup: - VIR_FREE(addr); - return ret; } -- GitLab