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
|
* 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
|
* Copyright (C) 2006-2008 Daniel P. Berrange
|
||||||
*
|
*
|
||||||
* This library is free software; you can redistribute it and/or
|
* 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 *targetName = virDomainChrTargetTypeToString(def->targetType);
|
||||||
const char *elementName;
|
const char *elementName;
|
||||||
|
|
||||||
const char *addr = NULL;
|
|
||||||
int ret = 0;
|
int ret = 0;
|
||||||
|
|
||||||
switch (def->targetType) {
|
switch (def->targetType) {
|
||||||
@ -4847,8 +4846,7 @@ virDomainChrDefFormat(virConnectPtr conn,
|
|||||||
if (!type) {
|
if (!type) {
|
||||||
virDomainReportError(conn, VIR_ERR_INTERNAL_ERROR,
|
virDomainReportError(conn, VIR_ERR_INTERNAL_ERROR,
|
||||||
_("unexpected char type %d"), def->type);
|
_("unexpected char type %d"), def->type);
|
||||||
ret = -1;
|
return -1;
|
||||||
goto cleanup;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Compat with legacy <console tty='/dev/pts/5'/> syntax */
|
/* Compat with legacy <console tty='/dev/pts/5'/> syntax */
|
||||||
@ -4931,23 +4929,25 @@ virDomainChrDefFormat(virConnectPtr conn,
|
|||||||
|
|
||||||
switch (def->targetType) {
|
switch (def->targetType) {
|
||||||
case VIR_DOMAIN_CHR_TARGET_TYPE_GUESTFWD:
|
case VIR_DOMAIN_CHR_TARGET_TYPE_GUESTFWD:
|
||||||
addr = virSocketFormatAddr(def->target.addr);
|
{
|
||||||
if (addr == NULL) {
|
int port = virSocketGetPort(def->target.addr);
|
||||||
virDomainReportError(conn, VIR_ERR_INTERNAL_ERROR, "%s",
|
if (port < 0) {
|
||||||
_("Unable to format guestfwd address"));
|
virDomainReportError(conn, VIR_ERR_INTERNAL_ERROR, "%s",
|
||||||
ret = -1;
|
_("Unable to format guestfwd port"));
|
||||||
goto cleanup;
|
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_PARALLEL:
|
||||||
case VIR_DOMAIN_CHR_TARGET_TYPE_SERIAL:
|
case VIR_DOMAIN_CHR_TARGET_TYPE_SERIAL:
|
||||||
@ -4969,9 +4969,6 @@ virDomainChrDefFormat(virConnectPtr conn,
|
|||||||
virBufferVSprintf(buf, " </%s>\n",
|
virBufferVSprintf(buf, " </%s>\n",
|
||||||
elementName);
|
elementName);
|
||||||
|
|
||||||
cleanup:
|
|
||||||
VIR_FREE(addr);
|
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user