Blob Blame History Raw
From 53d819c68d21accc815b59d887075b6e47e4c07f Mon Sep 17 00:00:00 2001
From: Thomas Graf <tgraf@suug.ch>
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 <mbizon@freebox.fr>
Signed-off-by: Thomas Graf <tgraf@suug.ch>
(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 <thaller@redhat.com>
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 <thaller@redhat.com>
(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