Blame SOURCES/0020-netlink-reset-mnl_socket-field-in-struct-nft_ctx-on-.patch

9ff721
From c8b6092b4fec23b823695c0c9b10325f9c33150c Mon Sep 17 00:00:00 2001
9ff721
From: Pablo Neira Ayuso <pablo@netfilter.org>
9ff721
Date: Mon, 22 Oct 2018 21:20:44 +0200
9ff721
Subject: [PATCH] netlink: reset mnl_socket field in struct nft_ctx on EINTR
9ff721
9ff721
Otherwise we keep using the old netlink socket if we hit EINTR.
9ff721
9ff721
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
9ff721
(cherry picked from commit d7ef1e206bd9b36607dddcf337fada11d743b61f)
9ff721
9ff721
Conflicts:
9ff721
	include/netlink.h
9ff721
-> Missing upstream commit 0562beb6544d3 ("src: get rid of netlink_genid_get()")
9ff721
9ff721
Signed-off-by: Phil Sutter <psutter@redhat.com>
9ff721
---
9ff721
 include/netlink.h | 2 +-
9ff721
 src/netlink.c     | 4 ++--
9ff721
 src/rule.c        | 3 +--
9ff721
 3 files changed, 4 insertions(+), 5 deletions(-)
9ff721
9ff721
diff --git a/include/netlink.h b/include/netlink.h
9ff721
index 31465ff16822e..894bf6fc98487 100644
9ff721
--- a/include/netlink.h
9ff721
+++ b/include/netlink.h
9ff721
@@ -191,7 +191,7 @@ extern void netlink_dump_obj(struct nftnl_obj *nlo, struct netlink_ctx *ctx);
9ff721
 extern int netlink_batch_send(struct netlink_ctx *ctx, struct list_head *err_list);
9ff721
 
9ff721
 extern uint16_t netlink_genid_get(struct netlink_ctx *ctx);
9ff721
-extern void netlink_restart(struct mnl_socket *nf_sock);
9ff721
+extern struct mnl_socket *netlink_restart(struct mnl_socket *nf_sock);
9ff721
 #define netlink_abi_error()	\
9ff721
 	__netlink_abi_error(__FILE__, __LINE__, strerror(errno));
9ff721
 extern void __noreturn __netlink_abi_error(const char *file, int line, const char *reason);
9ff721
diff --git a/src/netlink.c b/src/netlink.c
9ff721
index e16eb504fdef8..c178be3c9ee26 100644
9ff721
--- a/src/netlink.c
9ff721
+++ b/src/netlink.c
9ff721
@@ -73,10 +73,10 @@ void netlink_close_sock(struct mnl_socket *nf_sock)
9ff721
 		mnl_socket_close(nf_sock);
9ff721
 }
9ff721
 
9ff721
-void netlink_restart(struct mnl_socket *nf_sock)
9ff721
+struct mnl_socket *netlink_restart(struct mnl_socket *nf_sock)
9ff721
 {
9ff721
 	netlink_close_sock(nf_sock);
9ff721
-	nf_sock = netlink_open_sock();
9ff721
+	return netlink_open_sock();
9ff721
 }
9ff721
 
9ff721
 uint16_t netlink_genid_get(struct netlink_ctx *ctx)
9ff721
diff --git a/src/rule.c b/src/rule.c
9ff721
index 6acfa3ac1695c..47b0d30cbed18 100644
9ff721
--- a/src/rule.c
9ff721
+++ b/src/rule.c
9ff721
@@ -161,7 +161,6 @@ int cache_update(struct nft_ctx *nft, enum cmd_ops cmd, struct list_head *msgs)
9ff721
 		.msgs		= msgs,
9ff721
 		.nft		= nft,
9ff721
 	};
9ff721
-	struct mnl_socket *nf_sock = nft->nf_sock;
9ff721
 	struct nft_cache *cache = &nft->cache;
9ff721
 
9ff721
 replay:
9ff721
@@ -176,7 +175,7 @@ replay:
9ff721
 	if (ret < 0) {
9ff721
 		cache_release(cache);
9ff721
 		if (errno == EINTR) {
9ff721
-			netlink_restart(nf_sock);
9ff721
+			nft->nf_sock = netlink_restart(nft->nf_sock);
9ff721
 			goto replay;
9ff721
 		}
9ff721
 		return -1;
9ff721
-- 
bacbc8
2.21.0
9ff721