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:
parent
f80ac75d0e
commit
9f26f32525
36
ui/vnc.c
36
ui/vnc.c
@ -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:
|
||||||
|
Loading…
x
Reference in New Issue
Block a user