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