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 <haleyb.dev@gmail.com>
This commit is contained in:
Brian Haley
2025-01-23 18:26:45 -05:00
committed by Simon Kelley
parent 6dbdf16fd1
commit efb8f10450

View File

@@ -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 = opt_malloc(sizeof(struct addrlist));
new_addr->next = new->addr6;
new_addr->flags = 0; new_addr->flags = 0;
new_addr->addr.addr6 = in6; new_addr->addr.addr6 = in6;
new->addr6 = new_addr;
if (pref) 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) ((((u64)1<<(128-new_addr->prefixlen))-1) & addrpart) != 0)
{ {
dhcp_config_free(new); dhcp_config_free(new);
ret_err(_("bad IPv6 prefix")); ret_err_free(_("bad IPv6 prefix"), new_addr);
} }
new_addr->flags |= ADDRLIST_PREFIX; 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) if (i == 8)
new_addr->flags |= ADDRLIST_WILDCARD; new_addr->flags |= ADDRLIST_WILDCARD;
new_addr->next = new->addr6;
new->addr6 = new_addr;
new->flags |= CONFIG_ADDR6; new->flags |= CONFIG_ADDR6;
} }
#endif #endif