Hello, On Thursday, 2008 May 22 at 15:00:35 +0500, Anton wrote: > > > The attached patch should fix the memory leak issue. > > Could you test it ? > > Accordingly to "top", it's still leaking. Yes, I should not code during conferences ;) I attach a patch which is working for me. BR, -- Eric Leblond INL: http://www.inl.fr/ NuFW: http://www.nufw.org/
diff --git a/src/iftable.c b/src/iftable.c index 7e6172b..01ccc8c 100644 --- a/src/iftable.c +++ b/src/iftable.c @@ -25,6 +25,8 @@ #define iftb_log(x, ...) +#define SIZE_IFHASH 16 + struct ifindex_map { struct ifindex_map *next; @@ -37,7 +39,7 @@ struct ifindex_map { }; struct nlif_handle { - struct ifindex_map *ifindex_map[16]; + struct ifindex_map *ifindex_map[SIZE_IFHASH]; struct rtnl_handle *rtnl_handle; struct rtnl_handler ifadd_handler; struct rtnl_handler ifdel_handler; @@ -222,6 +224,7 @@ static int iftable_up(struct nlif_handle *nlif_handle, unsigned int index) struct nlif_handle *nlif_open(void) { struct nlif_handle *h; + int i; h = calloc(1, sizeof(struct nlif_handle)); if (h == NULL) @@ -255,6 +258,21 @@ err: return NULL; } +static void free_indexmap(struct ifindex_map **indexmap) +{ + struct ifindex_map *ima, *imp; + int i; + + for (i = 0; i < SIZE_IFHASH; i++) { + for (ima = indexmap[i]; ima != NULL; ima = imp) { + if (ima) { + imp = ima->next; + free(ima); + } + } + } +} + /** Destructor of interface table * * \param nlif_handle A pointer to a ::nlif_handle created @@ -267,6 +285,7 @@ void nlif_close(struct nlif_handle *h) rtnl_handler_unregister(h->rtnl_handle, &h->ifadd_handler); rtnl_handler_unregister(h->rtnl_handle, &h->ifdel_handler); rtnl_close(h->rtnl_handle); + free_indexmap(h->ifindex_map); free(h); h = NULL; /* bugtrap */ }
Attachment:
signature.asc
Description: Digital signature