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