diff --git a/src/lib/bnet_server.c b/src/lib/bnet_server.c index c42239800c0..3a858ad2add 100644 --- a/src/lib/bnet_server.c +++ b/src/lib/bnet_server.c @@ -124,7 +124,7 @@ void bnet_thread_server(dlist *addr_list, int max_clients, alist *sockfds, #ifdef HAVE_LIBWRAP struct request_info request; #endif - IPADDR *ipaddr, *next; + IPADDR *ipaddr, *next, *to_free; s_sockfd *fd_ptr = NULL; char buf[128]; #ifdef HAVE_POLL @@ -137,14 +137,23 @@ void bnet_thread_server(dlist *addr_list, int max_clients, alist *sockfds, /* * Remove any duplicate addresses. */ - for (ipaddr = (IPADDR *)addr_list->first(); ipaddr; + for (ipaddr = (IPADDR *)addr_list->first(); + ipaddr; ipaddr = (IPADDR *)addr_list->next(ipaddr)) { - for (next = (IPADDR *)addr_list->next(ipaddr); next; - next = (IPADDR *)addr_list->next(next)) { + next = (IPADDR *)addr_list->next(ipaddr); + while (next) { + /* + * See if the addresses match. + */ if (ipaddr->get_sockaddr_len() == next->get_sockaddr_len() && memcmp(ipaddr->get_sockaddr(), next->get_sockaddr(), ipaddr->get_sockaddr_len()) == 0) { - addr_list->remove(next); + to_free = next; + next = (IPADDR *)addr_list->next(next); + addr_list->remove(to_free); + delete to_free; + } else { + next = (IPADDR *)addr_list->next(next); } } } diff --git a/src/lib/bsock.c b/src/lib/bsock.c index f4b53163041..94074443218 100644 --- a/src/lib/bsock.c +++ b/src/lib/bsock.c @@ -192,7 +192,7 @@ bool BSOCK::open(JCR *jcr, const char *name, char *host, char *service, { int sockfd = -1; dlist *addr_list; - IPADDR *ipaddr, *next; + IPADDR *ipaddr, *next, *to_free; bool connected = false; int turnon = 1; const char *errstr; @@ -216,13 +216,22 @@ bool BSOCK::open(JCR *jcr, const char *name, char *host, char *service, * Remove any duplicate addresses. */ for (ipaddr = (IPADDR *)addr_list->first(); - ipaddr; ipaddr = (IPADDR *)addr_list->next(ipaddr)) { - for (next = (IPADDR *)addr_list->next(ipaddr); next; - next = (IPADDR *)addr_list->next(next)) { + ipaddr; + ipaddr = (IPADDR *)addr_list->next(ipaddr)) { + next = (IPADDR *)addr_list->next(ipaddr); + while (next) { + /* + * See if the addresses match. + */ if (ipaddr->get_sockaddr_len() == next->get_sockaddr_len() && memcmp(ipaddr->get_sockaddr(), next->get_sockaddr(), ipaddr->get_sockaddr_len()) == 0) { - addr_list->remove(next); + to_free = next; + next = (IPADDR *)addr_list->next(next); + addr_list->remove(to_free); + delete to_free; + } else { + next = (IPADDR *)addr_list->next(next); } } }