From 92602dbecc654bf7cd737da384736694b0702bfe Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Fri, 4 Apr 2014 19:46:10 +0200 Subject: [PATCH] fix breaking on older kernels due to IFA_FLAGS attribute Resolves: #1063885 --- 0001.ifa_flags-workaround.patch | 52 +++++++++++++++++++++++++++++++++ libnl3.spec | 7 ++++- 2 files changed, 58 insertions(+), 1 deletion(-) create mode 100644 0001.ifa_flags-workaround.patch diff --git a/0001.ifa_flags-workaround.patch b/0001.ifa_flags-workaround.patch new file mode 100644 index 0000000..b420a47 --- /dev/null +++ b/0001.ifa_flags-workaround.patch @@ -0,0 +1,52 @@ +From dce5f1ce978118ed4a8384c151f5ce720ab1f5df Mon Sep 17 00:00:00 2001 +From: Thomas Haller +Date: Thu, 3 Apr 2014 18:09:51 +0200 +Subject: [PATCH 1/1] route/addr: only sent IFA_FLAGS when needed to workaround + picky older kernels + +Older kernels don't accept receiving unknown netlink attributes. +See net/core/rtnetlink.c, rtnetlink_rcv_msg(). This was fixed by kernel +commit 661d2967b3f1b34eeaa7e212e7b9bbe8ee072b59. + +As a workaround, only set the additional attributes, when the user +provided flags that makes this necessary and useful. + +https://github.com/thom311/libnl/issues/56 +https://bugzilla.redhat.com/show_bug.cgi?id=1063885 + +Based-on-patch-by: Pavel Kankovsky +Acked-by: Thomas Graf +Signed-off-by: Thomas Haller +(cherry picked from commit 5206c050504f8676a24854519b9c351470fb7cc6) +--- + lib/route/addr.c | 14 +++++++++++++- + 1 file changed, 13 insertions(+), 1 deletion(-) + +diff --git a/lib/route/addr.c b/lib/route/addr.c +index 97905f0..e6e91d2 100644 +--- a/lib/route/addr.c ++++ b/lib/route/addr.c +@@ -598,7 +598,19 @@ static int build_addr_msg(struct rtnl_addr *tmpl, int cmd, int flags, + NLA_PUT(msg, IFA_CACHEINFO, sizeof(ca), &ca); + } + +- NLA_PUT_U32(msg, IFA_FLAGS, tmpl->a_flags); ++ if (tmpl->a_flags & ~0xFF) { ++ /* only set the IFA_FLAGS attribute, if they actually contain additional ++ * flags that are not already set to am.ifa_flags. ++ * ++ * Older kernels refuse RTM_NEWADDR and RTM_NEWROUTE messages with EINVAL ++ * if they contain unknown netlink attributes. See net/core/rtnetlink.c, which ++ * was fixed by kernel commit 661d2967b3f1b34eeaa7e212e7b9bbe8ee072b59. ++ * ++ * With this workaround, libnl will function correctly with older kernels, ++ * unless there is a new libnl user that wants to set these flags. In this ++ * case it's up to the user to workaround this issue. */ ++ NLA_PUT_U32(msg, IFA_FLAGS, tmpl->a_flags); ++ } + + *result = msg; + return 0; +-- +1.9.0 + diff --git a/libnl3.spec b/libnl3.spec index 325554b..5c5acf5 100644 --- a/libnl3.spec +++ b/libnl3.spec @@ -3,10 +3,11 @@ Group: Development/Libraries License: LGPLv2 Name: libnl3 Version: 3.2.24 -Release: 1%{?dist} +Release: 2%{?dist} URL: http://www.infradead.org/~tgr/libnl/ Source: http://www.infradead.org/~tgr/libnl/files/libnl-%{version}.tar.gz Source1: http://www.infradead.org/~tgr/libnl/files/libnl-doc-%{version}.tar.gz +Patch1: 0001.ifa_flags-workaround.patch BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root BuildRequires: flex bison BuildRequires: python @@ -45,6 +46,7 @@ This package contains libnl3 API documentation %prep %setup -q -n libnl-%{version} +%patch1 -p1 -b .0001.ifa_flags-workaround.orig tar -xzf %SOURCE1 @@ -97,6 +99,9 @@ find $RPM_BUILD_ROOT -name \*.la -delete %doc libnl-doc-%{version}/api/* %changelog +* Fri Apr 4 2014 Thomas Haller - 3.2.24-2 +- fix breaking on older kernels due to IFA_FLAGS attribute (rh #1063885) + * Thu Jan 23 2014 Thomas Haller - 3.2.24-1 - Update to 3.2.24 (rhbz#963111)