thaller pushed to libnl3 (f21). "fix memleaks with io_alloc() calls"

notifications at fedoraproject.org notifications at fedoraproject.org
Mon May 11 22:26:04 UTC 2015


From ad63c089dab150468a5416b2fef0e3cf038602b1 Mon Sep 17 00:00:00 2001
From: Thomas Haller <thaller at redhat.com>
Date: Tue, 12 May 2015 00:21:29 +0200
Subject: fix memleaks with io_alloc() calls


diff --git a/0003-memleak-io-alloc.patch b/0003-memleak-io-alloc.patch
new file mode 100644
index 0000000..905fdab
--- /dev/null
+++ b/0003-memleak-io-alloc.patch
@@ -0,0 +1,279 @@
+From b0abffe19cc3b308cfa1c7e853dbb5dbf6564942 Mon Sep 17 00:00:00 2001
+From: Thomas Haller <thaller at redhat.com>
+Date: Mon, 18 Aug 2014 15:24:30 +0200
+Subject: [PATCH 1/1] link: fix memory leaks due to repeated calls to
+ .io_alloc()
+
+All the io_alloc() implementation unconditionally allocated
+new memory, thus leaking memory if called more then once.
+Fix io_alloc() implementations not to allocate new memory
+if not needed.
+
+This happens for example in link_msg_parser() which first
+calls rtnl_link_set_type():
+
+    #0  macvlan_alloc (link=0x609d50) at route/link/macvlan.c:56
+    #1  0x00007ffff7b99a78 in rtnl_link_set_type (link=link at entry=0x609d50, type=type at entry=0x609a94 "macvlan") at route/link.c:2233
+    #2  0x00007ffff7b99c28 in link_msg_parser (ops=<optimized out>, who=<optimized out>, n=<optimized out>, pp=0x7fffffffd870) at route/link.c:547
+    #3  0x00007ffff7dea109 in nl_cache_parse (ops=0x7ffff7dd8600 <rtnl_link_ops>, who=0x603338, nlh=0x6098a0, params=0x7fffffffd870) at cache.c:914
+    #4  0x00007ffff7dea15b in update_msg_parser (msg=<optimized out>, arg=<optimized out>) at cache.c:668
+    #5  0x00007ffff7def7bf in nl_cb_call (msg=<optimized out>, type=<optimized out>, cb=<optimized out>) at ../include/netlink-private/netlink.h:142
+    #6  recvmsgs (cb=0x6057a0, sk=0x6034c0) at nl.c:952
+    #7  nl_recvmsgs_report (sk=sk at entry=0x6034c0, cb=cb at entry=0x6057a0) at nl.c:1003
+    #8  0x00007ffff7defb79 in nl_recvmsgs (sk=sk at entry=0x6034c0, cb=cb at entry=0x6057a0) at nl.c:1027
+    #9  0x00007ffff7de9668 in __cache_pickup (sk=0x6034c0, cache=0x603510, param=param at entry=0x7fffffffd870) at cache.c:701
+    #10 0x00007ffff7dea08d in nl_cache_pickup (sk=<optimized out>, cache=<optimized out>) at cache.c:753
+    #11 0x0000000000400d56 in main ()
+
+and later ops->io_parse():
+
+    #0  macvlan_alloc (link=0x609d50) at route/link/macvlan.c:56
+    #1  0x00007ffff7baae9d in macvlan_parse (link=0x609d50, data=<optimized out>, xstats=<optimized out>) at route/link/macvlan.c:79
+    #2  0x00007ffff7b99c80 in link_msg_parser (ops=<optimized out>, who=<optimized out>, n=<optimized out>, pp=0x7fffffffd870) at route/link.c:567
+    #3  0x00007ffff7dea109 in nl_cache_parse (ops=0x7ffff7dd8600 <rtnl_link_ops>, who=0x603338, nlh=0x6098a0, params=0x7fffffffd870) at cache.c:914
+    #4  0x00007ffff7dea15b in update_msg_parser (msg=<optimized out>, arg=<optimized out>) at cache.c:668
+    #5  0x00007ffff7def7bf in nl_cb_call (msg=<optimized out>, type=<optimized out>, cb=<optimized out>) at ../include/netlink-private/netlink.h:142
+    #6  recvmsgs (cb=0x6057a0, sk=0x6034c0) at nl.c:952
+    #7  nl_recvmsgs_report (sk=sk at entry=0x6034c0, cb=cb at entry=0x6057a0) at nl.c:1003
+    #8  0x00007ffff7defb79 in nl_recvmsgs (sk=sk at entry=0x6034c0, cb=cb at entry=0x6057a0) at nl.c:1027
+    #9  0x00007ffff7de9668 in __cache_pickup (sk=0x6034c0, cache=0x603510, param=param at entry=0x7fffffffd870) at cache.c:701
+    #10 0x00007ffff7dea08d in nl_cache_pickup (sk=<optimized out>, cache=<optimized out>) at cache.c:753
+    #11 0x0000000000400d56 in main ()
+
+https://github.com/thom311/libnl/issues/59
+
+Signed-off-by: Thomas Haller <thaller at redhat.com>
+(cherry picked from commit d65c32a7205e679c7fc13f0e4565b13e698ba906)
+---
+ lib/route/link/can.c     | 14 +++++++++-----
+ lib/route/link/ip6tnl.c  | 14 +++++++++-----
+ lib/route/link/ipgre.c   | 14 +++++++++-----
+ lib/route/link/ipip.c    | 14 +++++++++-----
+ lib/route/link/ipvti.c   | 14 +++++++++-----
+ lib/route/link/macvlan.c | 10 +++++++---
+ lib/route/link/sit.c     | 14 +++++++++-----
+ lib/route/link/vlan.c    | 12 +++++++++---
+ lib/route/link/vxlan.c   | 10 +++++++---
+ 9 files changed, 77 insertions(+), 39 deletions(-)
+
+diff --git a/lib/route/link/can.c b/lib/route/link/can.c
+index 60da42d..a3f2385 100644
+--- a/lib/route/link/can.c
++++ b/lib/route/link/can.c
+@@ -73,11 +73,15 @@ static int can_alloc(struct rtnl_link *link)
+ {
+ 	struct can_info *ci;
+ 
+-	ci = calloc(1, sizeof(*ci));
+-	if (!ci)
+-		return -NLE_NOMEM;
+-
+-	link->l_info = ci;
++	if (link->l_info)
++		memset(link->l_info, 0, sizeof(*ci));
++	else {
++		ci = calloc(1, sizeof(*ci));
++		if (!ci)
++			return -NLE_NOMEM;
++
++		link->l_info = ci;
++	}
+ 
+ 	return 0;
+ }
+diff --git a/lib/route/link/ip6tnl.c b/lib/route/link/ip6tnl.c
+index 9fe1367..b5f5799 100644
+--- a/lib/route/link/ip6tnl.c
++++ b/lib/route/link/ip6tnl.c
+@@ -72,11 +72,15 @@ static int ip6_tnl_alloc(struct rtnl_link *link)
+ {
+ 	struct ip6_tnl_info *ip6_tnl;
+ 
+-	ip6_tnl = calloc(1, sizeof(*ip6_tnl));
+-	if (!ip6_tnl)
+-		return -NLE_NOMEM;
+-
+-	link->l_info = ip6_tnl;
++	if (link->l_info)
++		memset(link->l_info, 0, sizeof(*ip6_tnl));
++	else {
++		ip6_tnl = calloc(1, sizeof(*ip6_tnl));
++		if (!ip6_tnl)
++			return -NLE_NOMEM;
++
++		link->l_info = ip6_tnl;
++	}
+ 
+ 	return 0;
+ }
+diff --git a/lib/route/link/ipgre.c b/lib/route/link/ipgre.c
+index 74dbb9d..b67a75e 100644
+--- a/lib/route/link/ipgre.c
++++ b/lib/route/link/ipgre.c
+@@ -74,11 +74,15 @@ static int ipgre_alloc(struct rtnl_link *link)
+ {
+ 	struct ipgre_info *ipgre;
+ 
+-	ipgre = calloc(1, sizeof(*ipgre));
+-	if (!ipgre)
+-		return -NLE_NOMEM;
+-
+-	link->l_info = ipgre;
++	if (link->l_info)
++		memset(link->l_info, 0, sizeof(*ipgre));
++	else {
++		ipgre = calloc(1, sizeof(*ipgre));
++		if (!ipgre)
++			return -NLE_NOMEM;
++
++		link->l_info = ipgre;
++	}
+ 
+ 	return 0;
+ }
+diff --git a/lib/route/link/ipip.c b/lib/route/link/ipip.c
+index ecf86ad..38f8fef 100644
+--- a/lib/route/link/ipip.c
++++ b/lib/route/link/ipip.c
+@@ -62,11 +62,15 @@ static int ipip_alloc(struct rtnl_link *link)
+ {
+ 	struct ipip_info *ipip;
+ 
+-	ipip = calloc(1, sizeof(*ipip));
+-	if (!ipip)
+-		return -NLE_NOMEM;
+-
+-	link->l_info = ipip;
++	if (link->l_info)
++		memset(link->l_info, 0, sizeof(*ipip));
++	else {
++		ipip = calloc(1, sizeof(*ipip));
++		if (!ipip)
++			return -NLE_NOMEM;
++
++		link->l_info = ipip;
++	}
+ 
+ 	return 0;
+ }
+diff --git a/lib/route/link/ipvti.c b/lib/route/link/ipvti.c
+index 71f61c3..b94c573 100644
+--- a/lib/route/link/ipvti.c
++++ b/lib/route/link/ipvti.c
+@@ -59,11 +59,15 @@ static int ipvti_alloc(struct rtnl_link *link)
+ {
+ 	struct ipvti_info *ipvti;
+ 
+-	ipvti = calloc(1, sizeof(*ipvti));
+-	if (!ipvti)
+-		return -NLE_NOMEM;
+-
+-	link->l_info = ipvti;
++	if (link->l_info)
++		memset(link->l_info, 0, sizeof(*ipvti));
++	else {
++		ipvti = calloc(1, sizeof(*ipvti));
++		if (!ipvti)
++			return -NLE_NOMEM;
++
++		link->l_info = ipvti;
++	}
+ 
+ 	return 0;
+ }
+diff --git a/lib/route/link/macvlan.c b/lib/route/link/macvlan.c
+index 2340903..018362e 100644
+--- a/lib/route/link/macvlan.c
++++ b/lib/route/link/macvlan.c
+@@ -55,10 +55,14 @@ static int macvlan_alloc(struct rtnl_link *link)
+ {
+ 	struct macvlan_info *mvi;
+ 
+-	if ((mvi = calloc(1, sizeof(*mvi))) == NULL)
+-		return -NLE_NOMEM;
++	if (link->l_info)
++		memset(link->l_info, 0, sizeof(*mvi));
++	else {
++		if ((mvi = calloc(1, sizeof(*mvi))) == NULL)
++			return -NLE_NOMEM;
+ 
+-	link->l_info = mvi;
++		link->l_info = mvi;
++	}
+ 
+ 	return 0;
+ }
+diff --git a/lib/route/link/sit.c b/lib/route/link/sit.c
+index 694c177..bee8dca 100644
+--- a/lib/route/link/sit.c
++++ b/lib/route/link/sit.c
+@@ -68,11 +68,15 @@ static int sit_alloc(struct rtnl_link *link)
+ {
+ 	struct sit_info *sit;
+ 
+-	sit = calloc(1, sizeof(*sit));
+-	if (!sit)
+-		return -NLE_NOMEM;
+-
+-	link->l_info = sit;
++	if (link->l_info)
++		memset(link->l_info, 0, sizeof(*sit));
++	else {
++		sit = calloc(1, sizeof(*sit));
++		if (!sit)
++			return -NLE_NOMEM;
++
++		link->l_info = sit;
++	}
+ 
+ 	return 0;
+ }
+diff --git a/lib/route/link/vlan.c b/lib/route/link/vlan.c
+index b9f0c66..a40ee66 100644
+--- a/lib/route/link/vlan.c
++++ b/lib/route/link/vlan.c
+@@ -67,10 +67,16 @@ static int vlan_alloc(struct rtnl_link *link)
+ {
+ 	struct vlan_info *vi;
+ 
+-	if ((vi = calloc(1, sizeof(*vi))) == NULL)
+-		return -NLE_NOMEM;
++	if (link->l_info) {
++		vi = link->l_info;
++		free(vi->vi_egress_qos);
++		memset(link->l_info, 0, sizeof(*vi));
++	} else {
++		if ((vi = calloc(1, sizeof(*vi))) == NULL)
++			return -NLE_NOMEM;
+ 
+-	link->l_info = vi;
++		link->l_info = vi;
++	}
+ 
+ 	return 0;
+ }
+diff --git a/lib/route/link/vxlan.c b/lib/route/link/vxlan.c
+index f3e3538..8a9c6e0 100644
+--- a/lib/route/link/vxlan.c
++++ b/lib/route/link/vxlan.c
+@@ -91,10 +91,14 @@ static int vxlan_alloc(struct rtnl_link *link)
+ {
+ 	struct vxlan_info *vxi;
+ 
+-	if ((vxi = calloc(1, sizeof(*vxi))) == NULL)
+-		return -NLE_NOMEM;
++	if (link->l_info)
++		memset(link->l_info, 0, sizeof(*vxi));
++	else {
++		if ((vxi = calloc(1, sizeof(*vxi))) == NULL)
++			return -NLE_NOMEM;
+ 
+-	link->l_info = vxi;
++		link->l_info = vxi;
++	}
+ 
+ 	return 0;
+ }
+-- 
+2.1.0
+
diff --git a/libnl3.spec b/libnl3.spec
index bedcf65..31f51b7 100644
--- a/libnl3.spec
+++ b/libnl3.spec
@@ -1,6 +1,6 @@
 Name: libnl3
 Version: 3.2.25
-Release: 5%{?dist}
+Release: 6%{?dist}
 Summary: Convenience library for kernel netlink sockets
 Group: Development/Libraries
 License: LGPLv2
@@ -12,6 +12,7 @@ Source: http://www.infradead.org/~tgr/libnl/files/libnl-%{fullversion}.tar.gz
 Source1: http://www.infradead.org/~tgr/libnl/files/libnl-doc-%{fullversion}.tar.gz
 Patch1: 0001-link-inet6-add-support-for-tokenized-interface-ident.patch
 Patch2: 0002-i6-addr-gen-mode.patch
+Patch3: 0003-memleak-io-alloc.patch
 
 BuildRequires: flex bison
 BuildRequires: python
@@ -53,6 +54,7 @@ This package contains libnl3 API documentation
 %setup -q -n libnl-%{fullversion}
 %patch1 -p1 -b .0001-link-inet6-add-support-for-tokenized-interface-ident.orig
 %patch2 -p1 -b .0002-i6-addr-gen-mode.orig
+%patch3 -p1 -b .0003-memleak-io-alloc.orig
 
 tar -xzf %SOURCE1
 
@@ -105,6 +107,9 @@ make check
 %doc libnl-doc-%{fullversion}/api/*
 
 %changelog
+* Tue May 12 2015 Thomas Haller <thaller at redhat.com> - 3.2.25-6
+- fix memleaks with io_alloc() calls
+
 * Tue Dec  9 2014 Thomas Haller <thaller at redhat.com> - 3.2.25-5
 - Add support for IPv6 link local address generation
 
-- 
cgit v0.10.2


	http://pkgs.fedoraproject.org/cgit/libnl3.git/commit/?h=f21&id=ad63c089dab150468a5416b2fef0e3cf038602b1


More information about the scm-commits mailing list