From a5dbbb061fdbf59c5bc6797fdf6eff52ec643980 Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Aug 26 2016 14:54:11 +0000 Subject: route: fix regression for nl_object_identical() comparing AF_INET addresses Resolves: #1370526 --- diff --git a/0001-compare-v4-addr-rh1370526.patch b/0001-compare-v4-addr-rh1370526.patch new file mode 100644 index 0000000..5bc3c1e --- /dev/null +++ b/0001-compare-v4-addr-rh1370526.patch @@ -0,0 +1,103 @@ +From 39f7d88425b0c4a9bef1b6adec7e5f8e1dc2055e Mon Sep 17 00:00:00 2001 +From: Tobias Jungel +Date: Thu, 4 Aug 2016 10:01:43 +0200 +Subject: [PATCH 1/2] route/addr: address attributes based on object + +addr_id_attrs_get returned a fixed set of attributes for AF_INET. This +leads to an invalid cache in case the default cache manager is used. + +The error was cause by nl_object_identical, which checkes the ce_mask +of an object against the req_attrs. For route/addr objects the ce_mask +may contain the ADDR_ATTR_PEER, but the addr_id_attrs_get always +includes this attribute. Thus nl_object_identical fails always in case +no peer exists, which is the default for local addresses. + +Fixes: 83e851ca9c842ccb6dae411d3fff9c7e9561269a + +https://github.com/thom311/libnl/pull/105 + +Signed-off-by: Thomas Haller +(cherry picked from commit dfaba51b5b2b5ad7e3c4990c2af3f30acbe5f8d9) +--- + lib/route/addr.c | 9 ++++++--- + 1 file changed, 6 insertions(+), 3 deletions(-) + +diff --git a/lib/route/addr.c b/lib/route/addr.c +index b699c64..7d3ff39 100644 +--- a/lib/route/addr.c ++++ b/lib/route/addr.c +@@ -467,12 +467,15 @@ static void addr_dump_stats(struct nl_object *obj, struct nl_dump_params *p) + static uint32_t addr_id_attrs_get(struct nl_object *obj) + { + struct rtnl_addr *addr = (struct rtnl_addr *)obj; ++ uint32_t rv; + + switch (addr->a_family) { + case AF_INET: +- return (ADDR_ATTR_FAMILY | ADDR_ATTR_IFINDEX | +- ADDR_ATTR_LOCAL | ADDR_ATTR_PREFIXLEN | +- ADDR_ATTR_PEER); ++ rv = (ADDR_ATTR_FAMILY | ADDR_ATTR_IFINDEX | ++ ADDR_ATTR_LOCAL | ADDR_ATTR_PREFIXLEN); ++ if (addr->a_peer) ++ rv |= ADDR_ATTR_PEER; ++ return rv; + case AF_INET6: + return (ADDR_ATTR_FAMILY | ADDR_ATTR_IFINDEX | + ADDR_ATTR_LOCAL); +-- +2.7.4 + + +From f4fe5e0a570fb2ec67cbf9e17206deef542c6490 Mon Sep 17 00:00:00 2001 +From: Thomas Haller +Date: Sun, 14 Aug 2016 11:05:48 +0200 +Subject: [PATCH 2/2] lib: capability NL_CAPABILITY_RTNL_ADDR_PEER_ID_FIX for + ID comparison of v4 addresses + +The ID attributes for IPv4 addresses were broken which causes wrong +nl_object_identical() and cache lookup. + +This capability shall indicate that the bug was fixed. + +Signed-off-by: Thomas Haller +(cherry picked from commit 99b1d8acf87bcb35efed49f412d54af682bf1738) +--- + include/netlink/utils.h | 7 +++++++ + lib/utils.c | 2 +- + 2 files changed, 8 insertions(+), 1 deletion(-) + +diff --git a/include/netlink/utils.h b/include/netlink/utils.h +index 3b10340..1115bb4 100644 +--- a/include/netlink/utils.h ++++ b/include/netlink/utils.h +@@ -217,6 +217,13 @@ enum { + NL_CAPABILITY_VERSION_3_2_28 = 19, + #define NL_CAPABILITY_VERSION_3_2_28 NL_CAPABILITY_VERSION_3_2_28 + ++ /** ++ * After NL_CAPABILITY_RTNL_ADDR_PEER_FIX, a follow up regression to lookup ++ * IPv4 addresses in the cache was fixed (PR#105). ++ */ ++ NL_CAPABILITY_RTNL_ADDR_PEER_ID_FIX = 20, ++#define NL_CAPABILITY_RTNL_ADDR_PEER_ID_FIX NL_CAPABILITY_RTNL_ADDR_PEER_ID_FIX ++ + __NL_CAPABILITY_MAX, + NL_CAPABILITY_MAX = (__NL_CAPABILITY_MAX - 1), + #define NL_CAPABILITY_MAX NL_CAPABILITY_MAX +diff --git a/lib/utils.c b/lib/utils.c +index 3399c03..0f2a252 100644 +--- a/lib/utils.c ++++ b/lib/utils.c +@@ -1164,7 +1164,7 @@ int nl_has_capability (int capability) + NL_CAPABILITY_XFRM_SA_KEY_SIZE, + NL_CAPABILITY_RTNL_ADDR_PEER_FIX, + NL_CAPABILITY_VERSION_3_2_28, +- 0, ++ NL_CAPABILITY_RTNL_ADDR_PEER_ID_FIX, + 0, + 0, + 0, +-- +2.7.4 + diff --git a/libnl3.spec b/libnl3.spec index 3cfb853..667b46f 100644 --- a/libnl3.spec +++ b/libnl3.spec @@ -1,6 +1,6 @@ Name: libnl3 Version: 3.2.28 -Release: 2%{?dist} +Release: 3%{?dist} Summary: Convenience library for kernel netlink sockets Group: Development/Libraries License: LGPLv2 @@ -11,6 +11,8 @@ URL: http://www.infradead.org/~tgr/libnl/ 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-compare-v4-addr-rh1370526.patch + BuildRequires: flex bison BuildRequires: python BuildRequires: libtool autoconf automake @@ -68,6 +70,7 @@ Python 3 bindings for libnl3 %prep %setup -q -n libnl-%{fullversion} +%patch1 -p1 tar -xzf %SOURCE1 @@ -125,7 +128,7 @@ popd %{_libdir}/libnl-cli*.so.* %{_libdir}/libnl/ %{_bindir}/* -%{_mandir}/man8/* +%{_mandir}/man8/* %files doc %doc COPYING @@ -148,6 +151,9 @@ popd %{python3_sitearch}/netlink-*.egg-info %changelog +* Fri Aug 26 2016 Thomas Haller - 3.2.28-3 +- route: fix nl_object_identical() comparing AF_INET addresses (rh #1370526) + * Tue Jul 19 2016 Fedora Release Engineering - 3.2.28-2 - https://fedoraproject.org/wiki/Changes/Automatic_Provides_for_Python_RPM_Packages