62 lines
2.0 KiB
Diff
62 lines
2.0 KiB
Diff
|
|
From efb8f104502c0d8efcd45101a767225042ef21d3 Mon Sep 17 00:00:00 2001
|
||
|
|
From: Brian Haley <haleyb.dev@gmail.com>
|
||
|
|
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 <haleyb.dev@gmail.com>
|
||
|
|
|
||
|
|
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
|
||
|
|
|