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....@gmail.com>
---
 src/option.c | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/src/option.c b/src/option.c
index e80144f..7db040b 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.34.1


_______________________________________________
Dnsmasq-discuss mailing list
Dnsmasq-discuss@lists.thekelleys.org.uk
https://lists.thekelleys.org.uk/cgi-bin/mailman/listinfo/dnsmasq-discuss

Reply via email to