From efb8f104502c0d8efcd45101a767225042ef21d3 Mon Sep 17 00:00:00 2001 From: Brian Haley Date: Thu, 23 Jan 2025 18:26:45 -0500 Subject: [PATCH] Fix potential memory leak When a new IPv6 address is being added to a dhcp_config struct, if there is anything invalid regarding the prefix it looks like there is a potential memory leak. ret_err_free() should be used to free it. Also, the new addrlist struct is being linked into the existing addr6 list in the dhcp_config before the validity check, it is best to defer this insertion until later so an invalid entry is not present, since the CONFIG_ADDR6 flag might not have been set yet. Signed-off-by: Brian Haley Reference:https://thekelleys.org.uk/gitweb/?p=dnsmasq.git;a=commit;h=efb8f104502c0d8efcd45101a767225042ef21d3 Conflict:NA --- src/option.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/option.c b/src/option.c index 16afb13..f3dee87 100644 --- a/src/option.c +++ b/src/option.c @@ -4043,10 +4043,8 @@ static int one_opt(int option, char *arg, char *errstr, char *gen_err, int comma } new_addr = opt_malloc(sizeof(struct addrlist)); - new_addr->next = new->addr6; new_addr->flags = 0; new_addr->addr.addr6 = in6; - new->addr6 = new_addr; if (pref) { @@ -4057,7 +4055,7 @@ static int one_opt(int option, char *arg, char *errstr, char *gen_err, int comma ((((u64)1<<(128-new_addr->prefixlen))-1) & addrpart) != 0) { dhcp_config_free(new); - ret_err(_("bad IPv6 prefix")); + ret_err_free(_("bad IPv6 prefix"), new_addr); } new_addr->flags |= ADDRLIST_PREFIX; @@ -4071,6 +4069,8 @@ static int one_opt(int option, char *arg, char *errstr, char *gen_err, int comma if (i == 8) new_addr->flags |= ADDRLIST_WILDCARD; + new_addr->next = new->addr6; + new->addr6 = new_addr; new->flags |= CONFIG_ADDR6; } #endif -- 2.33.0