From: Vincent Bernat Date: Thu, 15 Mar 2012 20:57:03 +0000 (+0100) Subject: mgmt: free management addresses when freeing the chassis X-Git-Tag: 0.6.0~35 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=5fb27919d237b0b4193c7b19c10c2c56d6c3d77d;p=thirdparty%2Flldpd.git mgmt: free management addresses when freeing the chassis --- diff --git a/src/interfaces.c b/src/interfaces.c index ce91f5dc..ea916e00 100644 --- a/src/interfaces.c +++ b/src/interfaces.c @@ -1063,18 +1063,13 @@ lldpd_ifh_mgmt(struct lldpd *cfg, struct ifaddrs *ifap) { struct ifaddrs *ifa; char addrstrbuf[INET6_ADDRSTRLEN]; - struct lldpd_mgmt *mgmt, *mgmt_next; + struct lldpd_mgmt *mgmt; void *sin_addr_ptr; size_t sin_addr_size; char *mgmt_pattern_ptr; int af; - for (mgmt = TAILQ_FIRST(&LOCAL_CHASSIS(cfg)->c_mgmt); mgmt; - mgmt = mgmt_next) { - mgmt_next = TAILQ_NEXT(mgmt, m_entries); - TAILQ_REMOVE(&LOCAL_CHASSIS(cfg)->c_mgmt, mgmt, m_entries); - free(mgmt); - } + lldpd_chassis_mgmt_cleanup(LOCAL_CHASSIS(cfg)); /* Find management addresses */ for (af = LLDPD_AF_UNSPEC + 1; af != LLDPD_AF_LAST; af++) { diff --git a/src/lldpd.c b/src/lldpd.c index 1ae7149e..628fb71b 100644 --- a/src/lldpd.c +++ b/src/lldpd.c @@ -272,6 +272,19 @@ lldpd_alloc_mgmt(int family, void *addrptr, size_t addrsize, u_int32_t iface) return mgmt; } +void +lldpd_chassis_mgmt_cleanup(struct lldpd_chassis *chassis) +{ + struct lldpd_mgmt *mgmt, *mgmt_next; + for (mgmt = TAILQ_FIRST(&chassis->c_mgmt); + mgmt != NULL; + mgmt = mgmt_next) { + mgmt_next = TAILQ_NEXT(mgmt, m_entries); + TAILQ_REMOVE(&chassis->c_mgmt, mgmt, m_entries); + free(mgmt); + } +} + void lldpd_chassis_cleanup(struct lldpd_chassis *chassis, int all) { @@ -287,6 +300,7 @@ lldpd_chassis_cleanup(struct lldpd_chassis *chassis, int all) free(chassis->c_id); free(chassis->c_name); free(chassis->c_descr); + lldpd_chassis_mgmt_cleanup(chassis); if (all) free(chassis); } diff --git a/src/lldpd.h b/src/lldpd.h index 9773e121..0af9c557 100644 --- a/src/lldpd.h +++ b/src/lldpd.h @@ -491,6 +491,7 @@ void lldpd_pi_cleanup(struct lldpd_port *); void lldpd_remote_cleanup(struct lldpd *, struct lldpd_hardware *, int); void lldpd_port_cleanup(struct lldpd*, struct lldpd_port *, int); struct lldpd_mgmt *lldpd_alloc_mgmt(int family, void *addr, size_t addrsize, u_int32_t iface); +void lldpd_chassis_mgmt_cleanup(struct lldpd_chassis *); void lldpd_chassis_cleanup(struct lldpd_chassis *, int); int lldpd_callback_add(struct lldpd *, int, void(*fn)(CALLBACK_SIG), void *); void lldpd_callback_del(struct lldpd *, int, void(*fn)(CALLBACK_SIG));