From 53d819c68d21accc815b59d887075b6e47e4c07f Mon Sep 17 00:00:00 2001 From: Thomas Graf Date: Fri, 1 Feb 2013 10:41:45 +0100 Subject: [PATCH 1/2] neigh: Remove check for AF_UNSPEC in rtnl_neigh_get() This check was introduces to not accidently return AF_BRIDGE objects to unaware API users as they do differ in structure. However, such objects are only available if explicitely requests using the NL_CACHE_AF_ITER flag or by using arg1 == AF_BRIDGE for the cache. Therefore remove this check and allow rtnl_neigh_get() to be used to fetch any neighbor object of a cache. Reported-by: Maxime Bizon Signed-off-by: Thomas Graf (cherry picked from commit 8571f58f23763d8db7365d02c9b27832ad3d7005) --- lib/route/neigh.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/route/neigh.c b/lib/route/neigh.c index c0f80a2..288bb85 100644 --- a/lib/route/neigh.c +++ b/lib/route/neigh.c @@ -532,6 +532,7 @@ int rtnl_neigh_alloc_cache(struct nl_sock *sock, struct nl_cache **result) * @arg cache neighbour cache * @arg ifindex interface index the neighbour is on * @arg dst destination address of the neighbour + * * @return neighbour handle or NULL if no match was found. */ struct rtnl_neigh * rtnl_neigh_get(struct nl_cache *cache, int ifindex, @@ -540,8 +541,7 @@ struct rtnl_neigh * rtnl_neigh_get(struct nl_cache *cache, int ifindex, struct rtnl_neigh *neigh; nl_list_for_each_entry(neigh, &cache->c_items, ce_list) { - if (neigh->n_family == AF_UNSPEC && - neigh->n_ifindex == ifindex && + if (neigh->n_ifindex == ifindex && !nl_addr_cmp(neigh->n_dst, dst)) { nl_object_get((struct nl_object *) neigh); return neigh; -- 2.4.3 From 6212b5522f5b40110729cd3fe4ac9c3dcaa2eb88 Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Tue, 29 Sep 2015 18:32:23 +0200 Subject: [PATCH 2/2] route: add capability indicating the behavior of rtnl_neigh_get() A wrong behavior for rtnl_neigh_get() was introduced between 3.2.14 and 3.2.15 (commit 64fcb47a36ec12d7e7f00605f6a8952ce985dd08). It was later fixed between 3.2.21 and 3.2.22 (commit 8571f58f23763d8db7365d02c9b27832ad3d7005). Add a capability NL_CAPABILITY_RTNL_NEIGH_GET_FILTER_AF_UNSPEC_FIX to indicate that this buggy behavior was fixed. https://bugzilla.redhat.com/show_bug.cgi?id=1261028 http://lists.infradead.org/pipermail/libnl/2015-August/001951.html Signed-off-by: Thomas Haller (cherry picked from commit 2a8a7c31e6accf1a22caebace8da4c03028d5500) --- include/netlink/utils.h | 8 ++++++++ lib/utils.c | 9 +++++++++ 2 files changed, 17 insertions(+) diff --git a/include/netlink/utils.h b/include/netlink/utils.h index 5b0d275..4b15372 100644 --- a/include/netlink/utils.h +++ b/include/netlink/utils.h @@ -99,6 +99,14 @@ enum { NL_CAPABILITY_NL_CONNECT_RETRY_GENERATE_PORT_ON_ADDRINUSE = 4, #define NL_CAPABILITY_NL_CONNECT_RETRY_GENERATE_PORT_ON_ADDRINUSE NL_CAPABILITY_NL_CONNECT_RETRY_GENERATE_PORT_ON_ADDRINUSE + /** + * Between 3.2.14 (64fcb47a36ec12d7e7f00605f6a8952ce985dd08) and 3.2.22 (8571f58f23763d8db7365d02c9b27832ad3d7005), + * rtnl_neigh_get() behaved differently and only returned objects with family AF_UNSPEC. + * This capability indicates, that the function was fixed. The absense of the capability, + * doesn't indicate however which behavior the function will have. So beware. */ + NL_CAPABILITY_RTNL_NEIGH_GET_FILTER_AF_UNSPEC_FIX = 10, +#define NL_CAPABILITY_RTNL_NEIGH_GET_FILTER_AF_UNSPEC_FIX NL_CAPABILITY_RTNL_NEIGH_GET_FILTER_AF_UNSPEC_FIX + __NL_CAPABILITY_MAX #define NL_CAPABILITY_MAX (__NL_CAPABILITY_MAX - 1) }; diff --git a/lib/utils.c b/lib/utils.c index 5149e07..6b6a87c 100644 --- a/lib/utils.c +++ b/lib/utils.c @@ -1143,6 +1143,15 @@ int nl_has_capability (int capability) 0, 0, 0), + _NL_SET(1, + 0, + NL_CAPABILITY_RTNL_NEIGH_GET_FILTER_AF_UNSPEC_FIX, + 0, + 0, + 0, + 0, + 0, + 0), #undef _NL_SET #undef _NL_SETV #undef _NL_ASSERT -- 2.4.3