mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2025-03-07 17:28:15 +00:00
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.
This commit is contained in:
parent
50b6c95d62
commit
1825c6555a
@ -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 <console tty='/dev/pts/5'/> 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"));
|
||||
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,
|
||||
" <target type='guestfwd' address='%s' port='%d'/>\n",
|
||||
addr, port);
|
||||
VIR_FREE(addr);
|
||||
break;
|
||||
}
|
||||
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;
|
||||
}
|
||||
virBufferVSprintf(buf, " <target type='guestfwd' address='%s' port='%d'/>\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, " </%s>\n",
|
||||
elementName);
|
||||
|
||||
cleanup:
|
||||
VIR_FREE(addr);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user