Hello, On Thursday, 2008 May 22 at 12:52:41 +0500, Anton wrote: > On Thursday 22 May 2008 12:43, Eric Leblond wrote: > > Hello, > > > > On Thursday, 2008 May 22 at 10:53:40 +0500, Anton wrote: > > You should not call nlif_open, nlif_close at each > > resolution: > > Yes, this is obvious, it was just a quick test. > > > > > Information about nlif usage: > > http://software.inl.fr/trac/wiki/articles/using_nlif > > Great, thanks! > > > > > Anyway, I will investigate to see what's going on. We > > definitely should not have a memory leak. The attached patch should fix the memory leak issue. Could you test it ? 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..a2844fd 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; @@ -255,6 +257,19 @@ err: return NULL; } +static void free_indexmap(struct ifindex_map **indexmap) +{ + struct ifindex_map *im, *ima, **imp; + int i; + + for (i = 0; i < SIZE_IFHASH; i++) { + for (ima = NULL, imp = &(indexmap[i]); + (im=*imp)!=NULL; imp = &im->next, ima=im) { + free(ima); + } + } +} + /** Destructor of interface table * * \param nlif_handle A pointer to a ::nlif_handle created @@ -267,6 +282,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