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