All of lore.kernel.org
 help / color / mirror / Atom feed
From: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
To: linux-kernel@vger.kernel.org
Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>,
	stable@vger.kernel.org, Liping Zhang <zlpnobody@gmail.com>,
	Pablo Neira Ayuso <pablo@netfilter.org>,
	Sasha Levin <alexander.levin@verizon.com>
Subject: [PATCH 3.18 22/35] netfilter: invoke synchronize_rcu after set the _hook_ to NULL
Date: Fri,  6 Oct 2017 11:25:02 +0200	[thread overview]
Message-ID: <20171006092403.696314004@linuxfoundation.org> (raw)
In-Reply-To: <20171006092402.810400570@linuxfoundation.org>

3.18-stable review patch.  If anyone has any objections, please let me know.

------------------

From: Liping Zhang <zlpnobody@gmail.com>


[ Upstream commit 3b7dabf029478bb80507a6c4500ca94132a2bc0b ]

Otherwise, another CPU may access the invalid pointer. For example:
    CPU0                CPU1
     -              rcu_read_lock();
     -              pfunc = _hook_;
  _hook_ = NULL;          -
  mod unload              -
     -                 pfunc(); // invalid, panic
     -             rcu_read_unlock();

So we must call synchronize_rcu() to wait the rcu reader to finish.

Also note, in nf_nat_snmp_basic_fini, synchronize_rcu() will be invoked
by later nf_conntrack_helper_unregister, but I'm inclined to add a
explicit synchronize_rcu after set the nf_nat_snmp_hook to NULL. Depend
on such obscure assumptions is not a good idea.

Last, in nfnetlink_cttimeout, we use kfree_rcu to free the time object,
so in cttimeout_exit, invoking rcu_barrier() is not necessary at all,
remove it too.

Signed-off-by: Liping Zhang <zlpnobody@gmail.com>
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
Signed-off-by: Sasha Levin <alexander.levin@verizon.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
---
 net/ipv4/netfilter/nf_nat_snmp_basic.c |    1 +
 net/netfilter/nf_conntrack_ecache.c    |    2 ++
 net/netfilter/nf_conntrack_netlink.c   |    1 +
 net/netfilter/nf_nat_core.c            |    2 ++
 net/netfilter/nfnetlink_cttimeout.c    |    1 +
 5 files changed, 7 insertions(+)

--- a/net/ipv4/netfilter/nf_nat_snmp_basic.c
+++ b/net/ipv4/netfilter/nf_nat_snmp_basic.c
@@ -1304,6 +1304,7 @@ static int __init nf_nat_snmp_basic_init
 static void __exit nf_nat_snmp_basic_fini(void)
 {
 	RCU_INIT_POINTER(nf_nat_snmp_hook, NULL);
+	synchronize_rcu();
 	nf_conntrack_helper_unregister(&snmp_trap_helper);
 }
 
--- a/net/netfilter/nf_conntrack_ecache.c
+++ b/net/netfilter/nf_conntrack_ecache.c
@@ -200,6 +200,7 @@ void nf_conntrack_unregister_notifier(st
 	BUG_ON(notify != new);
 	RCU_INIT_POINTER(net->ct.nf_conntrack_event_cb, NULL);
 	mutex_unlock(&nf_ct_ecache_mutex);
+	/* synchronize_rcu() is called from ctnetlink_exit. */
 }
 EXPORT_SYMBOL_GPL(nf_conntrack_unregister_notifier);
 
@@ -236,6 +237,7 @@ void nf_ct_expect_unregister_notifier(st
 	BUG_ON(notify != new);
 	RCU_INIT_POINTER(net->ct.nf_expect_event_cb, NULL);
 	mutex_unlock(&nf_ct_ecache_mutex);
+	/* synchronize_rcu() is called from ctnetlink_exit. */
 }
 EXPORT_SYMBOL_GPL(nf_ct_expect_unregister_notifier);
 
--- a/net/netfilter/nf_conntrack_netlink.c
+++ b/net/netfilter/nf_conntrack_netlink.c
@@ -3242,6 +3242,7 @@ static void __exit ctnetlink_exit(void)
 #ifdef CONFIG_NETFILTER_NETLINK_QUEUE_CT
 	RCU_INIT_POINTER(nfq_ct_hook, NULL);
 #endif
+	synchronize_rcu();
 }
 
 module_init(ctnetlink_init);
--- a/net/netfilter/nf_nat_core.c
+++ b/net/netfilter/nf_nat_core.c
@@ -888,6 +888,8 @@ static void __exit nf_nat_cleanup(void)
 #ifdef CONFIG_XFRM
 	RCU_INIT_POINTER(nf_nat_decode_session_hook, NULL);
 #endif
+	synchronize_rcu();
+
 	for (i = 0; i < NFPROTO_NUMPROTO; i++)
 		kfree(nf_nat_l4protos[i]);
 	synchronize_net();
--- a/net/netfilter/nfnetlink_cttimeout.c
+++ b/net/netfilter/nfnetlink_cttimeout.c
@@ -578,6 +578,7 @@ static void __exit cttimeout_exit(void)
 #ifdef CONFIG_NF_CONNTRACK_TIMEOUT
 	RCU_INIT_POINTER(nf_ct_timeout_find_get_hook, NULL);
 	RCU_INIT_POINTER(nf_ct_timeout_put_hook, NULL);
+	synchronize_rcu();
 #endif /* CONFIG_NF_CONNTRACK_TIMEOUT */
 }
 

  parent reply	other threads:[~2017-10-06  9:31 UTC|newest]

Thread overview: 43+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-10-06  9:24 [PATCH 3.18 00/35] 3.18.74-stable review Greg Kroah-Hartman
2017-10-06  9:24 ` [PATCH 3.18 01/35] drm: bridge: add DT bindings for TI ths8135 Greg Kroah-Hartman
2017-10-06  9:24 ` [PATCH 3.18 02/35] RDS: RDMA: Fix the composite message user notification Greg Kroah-Hartman
2017-10-06  9:24 ` [PATCH 3.18 03/35] MIPS: Ensure bss section ends on a long-aligned address Greg Kroah-Hartman
2017-10-06  9:24 ` [PATCH 3.18 04/35] MIPS: kexec: Do not reserve invalid crashkernel memory on boot Greg Kroah-Hartman
2017-10-06  9:24 ` [PATCH 3.18 06/35] hwmon: (gl520sm) Fix overflows and crash seen when writing into limit attributes Greg Kroah-Hartman
2017-10-06  9:24 ` [PATCH 3.18 07/35] ARM: 8635/1: nommu: allow enabling REMAP_VECTORS_TO_RAM Greg Kroah-Hartman
2017-10-06  9:24 ` [PATCH 3.18 08/35] tty: goldfish: Fix a parameter of a call to free_irq Greg Kroah-Hartman
2017-10-06  9:24 ` [PATCH 3.18 09/35] IB/ipoib: Fix deadlock over vlan_mutex Greg Kroah-Hartman
2017-10-06  9:24 ` [PATCH 3.18 10/35] IB/ipoib: rtnl_unlock can not come after free_netdev Greg Kroah-Hartman
2017-10-06  9:24 ` [PATCH 3.18 11/35] IB/ipoib: Replace list_del of the neigh->list with list_del_init Greg Kroah-Hartman
2017-10-06  9:24 ` [PATCH 3.18 12/35] USB: serial: mos7720: fix control-message error handling Greg Kroah-Hartman
2017-10-06  9:24 ` [PATCH 3.18 13/35] USB: serial: mos7840: " Greg Kroah-Hartman
2017-10-06  9:24 ` [PATCH 3.18 14/35] pinctrl: mvebu: Use seq_puts() in mvebu_pinconf_group_dbg_show() Greg Kroah-Hartman
2017-10-06  9:32   ` Joe Perches
2017-10-06  9:42     ` Greg Kroah-Hartman
2017-10-06  9:24 ` [PATCH 3.18 15/35] partitions/efi: Fix integer overflow in GPT size calculation Greg Kroah-Hartman
2017-10-06  9:24 ` [PATCH 3.18 16/35] audit: log 32-bit socketcalls Greg Kroah-Hartman
2017-10-06  9:24 ` [PATCH 3.18 17/35] net: core: Prevent from dereferencing null pointer when releasing SKB Greg Kroah-Hartman
2017-10-06  9:24 ` [PATCH 3.18 18/35] net/packet: check length in getsockopt() called with PACKET_HDRLEN Greg Kroah-Hartman
2017-10-06  9:24 ` [PATCH 3.18 19/35] team: fix memory leaks Greg Kroah-Hartman
2017-10-06  9:25 ` [PATCH 3.18 21/35] mmc: sdio: fix alignment issue in struct sdio_func Greg Kroah-Hartman
2017-10-06  9:25 ` Greg Kroah-Hartman [this message]
2017-10-06  9:25 ` [PATCH 3.18 23/35] [media] exynos-gsc: Do not swap cb/cr for semi planar formats Greg Kroah-Hartman
2017-10-06  9:25 ` [PATCH 3.18 24/35] netfilter: nfnl_cthelper: fix incorrect helper->expect_class_max Greg Kroah-Hartman
2017-10-06  9:25 ` [PATCH 3.18 25/35] parisc: perf: Fix potential NULL pointer dereference Greg Kroah-Hartman
2017-10-06  9:25 ` [PATCH 3.18 26/35] rds: ib: add error handle Greg Kroah-Hartman
2017-10-06  9:25 ` [PATCH 3.18 27/35] md/raid10: submit bio directly to replacement disk Greg Kroah-Hartman
2017-10-06  9:25 ` [PATCH 3.18 28/35] xfs: remove kmem_zalloc_greedy Greg Kroah-Hartman
2017-10-06  9:25 ` [PATCH 3.18 29/35] libata: transport: Remove circular dependency at free time Greg Kroah-Hartman
2017-10-06  9:25 ` [PATCH 3.18 30/35] IB/qib: fix false-postive maybe-uninitialized warning Greg Kroah-Hartman
2017-10-06  9:25 ` [PATCH 3.18 31/35] ALSA: au88x0: avoid theoretical uninitialized access Greg Kroah-Hartman
2017-10-06  9:25 ` [PATCH 3.18 32/35] [media] ttpci: address stringop overflow warning Greg Kroah-Hartman
2017-10-06  9:25 ` [PATCH 3.18 33/35] staging: nvec: remove duplicated const Greg Kroah-Hartman
2017-10-06  9:25 ` [PATCH 3.18 34/35] crypto: algif_skcipher - Load TX SG list after waiting Greg Kroah-Hartman
2017-10-06  9:25 ` [PATCH 3.18 35/35] mpi: Fix NULL ptr dereference in mpi_powm() [ver #3] Greg Kroah-Hartman
2017-10-06 14:03 ` [PATCH 3.18 00/35] 3.18.74-stable review Guenter Roeck
2017-10-07  9:38   ` Greg Kroah-Hartman
2017-10-06 17:30 ` Shuah Khan
2017-10-07  9:04   ` Greg Kroah-Hartman
2017-10-07  9:40 ` Greg Kroah-Hartman
2017-10-07 14:43   ` Guenter Roeck
2017-10-08  7:20     ` Greg Kroah-Hartman

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20171006092403.696314004@linuxfoundation.org \
    --to=gregkh@linuxfoundation.org \
    --cc=alexander.levin@verizon.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=pablo@netfilter.org \
    --cc=stable@vger.kernel.org \
    --cc=zlpnobody@gmail.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.