From 960c9f654d3257d9aa6a750829385be709c99cda Mon Sep 17 00:00:00 2001 From: Junhua Zhai Date: Wed, 6 Jul 2022 09:33:03 +0000 Subject: [PATCH 1/2] Check interface address exists --- src/dhcp6relay/src/relay.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/dhcp6relay/src/relay.cpp b/src/dhcp6relay/src/relay.cpp index 4b3b4d4010bf..88a4c9d70b0d 100644 --- a/src/dhcp6relay/src/relay.cpp +++ b/src/dhcp6relay/src/relay.cpp @@ -343,7 +343,7 @@ void prepare_relay_config(relay_config *interface_config, int *local_sock, int f } ifa_tmp = ifa; - while (ifa_tmp) { + while (ifa_tmp && ifa_tmp->ifa_addr) { if (ifa_tmp->ifa_addr->sa_family == AF_INET6) { struct sockaddr_in6 *in6 = (struct sockaddr_in6*) ifa_tmp->ifa_addr; if((strcmp(ifa_tmp->ifa_name, interface_config->interface.c_str()) == 0) && !IN6_IS_ADDR_LINKLOCAL(&in6->sin6_addr)) { @@ -401,7 +401,7 @@ void prepare_socket(int *local_sock, int *server_sock, relay_config *config, int } else { ifa_tmp = ifa; - while (ifa_tmp) { + while (ifa_tmp && ifa_tmp->ifa_addr) { if ((ifa_tmp->ifa_addr->sa_family == AF_INET6) && (strcmp(ifa_tmp->ifa_name, config->interface.c_str()) == 0)) { struct sockaddr_in6 *in6 = (struct sockaddr_in6*) ifa_tmp->ifa_addr; if(!IN6_IS_ADDR_LINKLOCAL(&in6->sin6_addr)) { From 1b8496dd394034470f5c2bdbba066a6ae60cb967 Mon Sep 17 00:00:00 2001 From: Junhua Zhai Date: Thu, 7 Jul 2022 01:25:18 +0000 Subject: [PATCH 2/2] Should check ifa_addr in if condition --- src/dhcp6relay/src/relay.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/dhcp6relay/src/relay.cpp b/src/dhcp6relay/src/relay.cpp index 88a4c9d70b0d..5233fe579fdc 100644 --- a/src/dhcp6relay/src/relay.cpp +++ b/src/dhcp6relay/src/relay.cpp @@ -343,8 +343,8 @@ void prepare_relay_config(relay_config *interface_config, int *local_sock, int f } ifa_tmp = ifa; - while (ifa_tmp && ifa_tmp->ifa_addr) { - if (ifa_tmp->ifa_addr->sa_family == AF_INET6) { + while (ifa_tmp) { + if (ifa_tmp->ifa_addr && ifa_tmp->ifa_addr->sa_family == AF_INET6) { struct sockaddr_in6 *in6 = (struct sockaddr_in6*) ifa_tmp->ifa_addr; if((strcmp(ifa_tmp->ifa_name, interface_config->interface.c_str()) == 0) && !IN6_IS_ADDR_LINKLOCAL(&in6->sin6_addr)) { non_link_local = *in6; @@ -401,8 +401,8 @@ void prepare_socket(int *local_sock, int *server_sock, relay_config *config, int } else { ifa_tmp = ifa; - while (ifa_tmp && ifa_tmp->ifa_addr) { - if ((ifa_tmp->ifa_addr->sa_family == AF_INET6) && (strcmp(ifa_tmp->ifa_name, config->interface.c_str()) == 0)) { + while (ifa_tmp) { + if (ifa_tmp->ifa_addr && (ifa_tmp->ifa_addr->sa_family == AF_INET6) && (strcmp(ifa_tmp->ifa_name, config->interface.c_str()) == 0)) { struct sockaddr_in6 *in6 = (struct sockaddr_in6*) ifa_tmp->ifa_addr; if(!IN6_IS_ADDR_LINKLOCAL(&in6->sin6_addr)) { bind_addr = true;