]> git.ipfire.org Git - thirdparty/lldpd.git/commitdiff
mgmt: free management addresses when freeing the chassis
authorVincent Bernat <bernat@luffy.cx>
Thu, 15 Mar 2012 20:57:03 +0000 (21:57 +0100)
committerVincent Bernat <bernat@luffy.cx>
Thu, 15 Mar 2012 21:17:06 +0000 (22:17 +0100)
src/interfaces.c
src/lldpd.c
src/lldpd.h

index ce91f5dcc1666298f07b7ea6a27b9df8c92b5729..ea916e00ee6b057f151f5d78a464eb751bb7748f 100644 (file)
@@ -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++) {
index 1ae7149e8bec3ac6c78252000c61cbe80446437e..628fb71badf4ca4544983de22537101724a6c1d7 100644 (file)
@@ -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);
 }
index 9773e1211b020ab0f04b24515cdef29aca897a4f..0af9c557bfbe1b3f984c07c4a0237c1d0c4dde8f 100644 (file)
@@ -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));