ui/vnc: fix leak of SocketAddress **

Extract the (correct) cleaning code as a new function vnc_free_addresses() then
use it to remove the memory leaks.

Reported-by: Clang Static Analyzer
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
Reviewed-by: Daniel P. Berrange <berrange@redhat.com>
Signed-off-by: Michael Tokarev <mjt@tls.msk.ru>
This commit is contained in:
Philippe Mathieu-Daudé 2017-07-26 23:42:11 -03:00 committed by Michael Tokarev
parent f80ac75d0e
commit 9f26f32525

@ -3521,6 +3521,20 @@ static int vnc_display_get_address(const char *addrstr,
return ret; return ret;
} }
static void vnc_free_addresses(SocketAddress ***retsaddr,
size_t *retnsaddr)
{
size_t i;
for (i = 0; i < *retnsaddr; i++) {
qapi_free_SocketAddress((*retsaddr)[i]);
}
g_free(*retsaddr);
*retsaddr = NULL;
*retnsaddr = 0;
}
static int vnc_display_get_addresses(QemuOpts *opts, static int vnc_display_get_addresses(QemuOpts *opts,
bool reverse, bool reverse,
SocketAddress ***retsaddr, SocketAddress ***retsaddr,
@ -3538,7 +3552,6 @@ static int vnc_display_get_addresses(QemuOpts *opts,
bool has_ipv6 = qemu_opt_get(opts, "ipv6"); bool has_ipv6 = qemu_opt_get(opts, "ipv6");
bool ipv4 = qemu_opt_get_bool(opts, "ipv4", false); bool ipv4 = qemu_opt_get_bool(opts, "ipv4", false);
bool ipv6 = qemu_opt_get_bool(opts, "ipv6", false); bool ipv6 = qemu_opt_get_bool(opts, "ipv6", false);
size_t i;
int displaynum = -1; int displaynum = -1;
int ret = -1; int ret = -1;
@ -3614,16 +3627,8 @@ static int vnc_display_get_addresses(QemuOpts *opts,
ret = 0; ret = 0;
cleanup: cleanup:
if (ret < 0) { if (ret < 0) {
for (i = 0; i < *retnsaddr; i++) { vnc_free_addresses(retsaddr, retnsaddr);
qapi_free_SocketAddress((*retsaddr)[i]); vnc_free_addresses(retwsaddr, retnwsaddr);
}
g_free(*retsaddr);
for (i = 0; i < *retnwsaddr; i++) {
qapi_free_SocketAddress((*retwsaddr)[i]);
}
g_free(*retwsaddr);
*retsaddr = *retwsaddr = NULL;
*retnsaddr = *retnwsaddr = 0;
} }
return ret; return ret;
} }
@ -3772,7 +3777,6 @@ void vnc_display_open(const char *id, Error **errp)
int acl = 0; int acl = 0;
int lock_key_sync = 1; int lock_key_sync = 1;
int key_delay_ms; int key_delay_ms;
size_t i;
if (!vd) { if (!vd) {
error_setg(errp, "VNC display not active"); error_setg(errp, "VNC display not active");
@ -3993,12 +3997,8 @@ void vnc_display_open(const char *id, Error **errp)
} }
cleanup: cleanup:
for (i = 0; i < nsaddr; i++) { vnc_free_addresses(&saddr, &nsaddr);
qapi_free_SocketAddress(saddr[i]); vnc_free_addresses(&wsaddr, &nwsaddr);
}
for (i = 0; i < nwsaddr; i++) {
qapi_free_SocketAddress(wsaddr[i]);
}
return; return;
fail: fail: