stable.vger.kernel.org archive mirror
 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,
	"John W. Linville" <linville@tuxdriver.com>,
	Jiri Benc <jbenc@redhat.com>,
	"David S. Miller" <davem@davemloft.net>
Subject: [PATCH 4.11 19/88] geneve: fix hlist corruption
Date: Wed, 19 Jul 2017 12:07:41 +0200	[thread overview]
Message-ID: <20170719100823.450757532@linuxfoundation.org> (raw)
In-Reply-To: <20170719100820.364094938@linuxfoundation.org>

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

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

From: Jiri Benc <jbenc@redhat.com>


[ Upstream commit 4b4c21fad6ae6bd58ff1566f23b0f4f70fdc9a30 ]

It's not a good idea to add the same hlist_node to two different hash lists.
This leads to various hard to debug memory corruptions.

Fixes: 8ed66f0e8235 ("geneve: implement support for IPv6-based tunnels")
Cc: John W. Linville <linville@tuxdriver.com>
Signed-off-by: Jiri Benc <jbenc@redhat.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
---
 drivers/net/geneve.c |   48 ++++++++++++++++++++++++++++++++----------------
 1 file changed, 32 insertions(+), 16 deletions(-)

--- a/drivers/net/geneve.c
+++ b/drivers/net/geneve.c
@@ -45,9 +45,17 @@ struct geneve_net {
 
 static unsigned int geneve_net_id;
 
+struct geneve_dev_node {
+	struct hlist_node hlist;
+	struct geneve_dev *geneve;
+};
+
 /* Pseudo network device */
 struct geneve_dev {
-	struct hlist_node  hlist;	/* vni hash table */
+	struct geneve_dev_node hlist4;	/* vni hash table for IPv4 socket */
+#if IS_ENABLED(CONFIG_IPV6)
+	struct geneve_dev_node hlist6;	/* vni hash table for IPv6 socket */
+#endif
 	struct net	   *net;	/* netns for packet i/o */
 	struct net_device  *dev;	/* netdev for geneve tunnel */
 	struct ip_tunnel_info info;
@@ -123,16 +131,16 @@ static struct geneve_dev *geneve_lookup(
 					__be32 addr, u8 vni[])
 {
 	struct hlist_head *vni_list_head;
-	struct geneve_dev *geneve;
+	struct geneve_dev_node *node;
 	__u32 hash;
 
 	/* Find the device for this VNI */
 	hash = geneve_net_vni_hash(vni);
 	vni_list_head = &gs->vni_list[hash];
-	hlist_for_each_entry_rcu(geneve, vni_list_head, hlist) {
-		if (eq_tun_id_and_vni((u8 *)&geneve->info.key.tun_id, vni) &&
-		    addr == geneve->info.key.u.ipv4.dst)
-			return geneve;
+	hlist_for_each_entry_rcu(node, vni_list_head, hlist) {
+		if (eq_tun_id_and_vni((u8 *)&node->geneve->info.key.tun_id, vni) &&
+		    addr == node->geneve->info.key.u.ipv4.dst)
+			return node->geneve;
 	}
 	return NULL;
 }
@@ -142,16 +150,16 @@ static struct geneve_dev *geneve6_lookup
 					 struct in6_addr addr6, u8 vni[])
 {
 	struct hlist_head *vni_list_head;
-	struct geneve_dev *geneve;
+	struct geneve_dev_node *node;
 	__u32 hash;
 
 	/* Find the device for this VNI */
 	hash = geneve_net_vni_hash(vni);
 	vni_list_head = &gs->vni_list[hash];
-	hlist_for_each_entry_rcu(geneve, vni_list_head, hlist) {
-		if (eq_tun_id_and_vni((u8 *)&geneve->info.key.tun_id, vni) &&
-		    ipv6_addr_equal(&addr6, &geneve->info.key.u.ipv6.dst))
-			return geneve;
+	hlist_for_each_entry_rcu(node, vni_list_head, hlist) {
+		if (eq_tun_id_and_vni((u8 *)&node->geneve->info.key.tun_id, vni) &&
+		    ipv6_addr_equal(&addr6, &node->geneve->info.key.u.ipv6.dst))
+			return node->geneve;
 	}
 	return NULL;
 }
@@ -579,6 +587,7 @@ static int geneve_sock_add(struct geneve
 {
 	struct net *net = geneve->net;
 	struct geneve_net *gn = net_generic(net, geneve_net_id);
+	struct geneve_dev_node *node;
 	struct geneve_sock *gs;
 	__u8 vni[3];
 	__u32 hash;
@@ -597,15 +606,20 @@ static int geneve_sock_add(struct geneve
 out:
 	gs->collect_md = geneve->collect_md;
 #if IS_ENABLED(CONFIG_IPV6)
-	if (ipv6)
+	if (ipv6) {
 		rcu_assign_pointer(geneve->sock6, gs);
-	else
+		node = &geneve->hlist6;
+	} else
 #endif
+	{
 		rcu_assign_pointer(geneve->sock4, gs);
+		node = &geneve->hlist4;
+	}
+	node->geneve = geneve;
 
 	tunnel_id_to_vni(geneve->info.key.tun_id, vni);
 	hash = geneve_net_vni_hash(vni);
-	hlist_add_head_rcu(&geneve->hlist, &gs->vni_list[hash]);
+	hlist_add_head_rcu(&node->hlist, &gs->vni_list[hash]);
 	return 0;
 }
 
@@ -632,8 +646,10 @@ static int geneve_stop(struct net_device
 {
 	struct geneve_dev *geneve = netdev_priv(dev);
 
-	if (!hlist_unhashed(&geneve->hlist))
-		hlist_del_rcu(&geneve->hlist);
+	hlist_del_init_rcu(&geneve->hlist4.hlist);
+#if IS_ENABLED(CONFIG_IPV6)
+	hlist_del_init_rcu(&geneve->hlist6.hlist);
+#endif
 	geneve_sock_release(geneve);
 	return 0;
 }

  parent reply	other threads:[~2017-07-19 10:07 UTC|newest]

Thread overview: 80+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-07-19 10:07 [PATCH 4.11 00/88] 4.11.12-stable review Greg Kroah-Hartman
2017-07-19 10:07 ` [PATCH 4.11 01/88] net/phy: micrel: configure intterupts after autoneg workaround Greg Kroah-Hartman
2017-07-19 10:07 ` [PATCH 4.11 02/88] ipv6: avoid unregistering inet6_dev for loopback Greg Kroah-Hartman
2017-07-19 10:07 ` [PATCH 4.11 03/88] netvsc: dont access netdev->num_rx_queues directly Greg Kroah-Hartman
2017-07-19 10:07 ` [PATCH 4.11 04/88] sfc: Fix MCDI command size for filter operations Greg Kroah-Hartman
2017-07-19 10:07 ` [PATCH 4.11 06/88] net: dp83640: Avoid NULL pointer dereference Greg Kroah-Hartman
2017-07-19 10:07 ` [PATCH 4.11 07/88] tcp: reset sk_rx_dst in tcp_disconnect() Greg Kroah-Hartman
2017-07-19 10:07 ` [PATCH 4.11 08/88] net: prevent sign extension in dev_get_stats() Greg Kroah-Hartman
2017-07-19 10:07 ` [PATCH 4.11 09/88] virtio-net: serialize tx routine during reset Greg Kroah-Hartman
2017-07-19 10:07 ` [PATCH 4.11 10/88] net: sched: Fix one possible panic when no destroy callback Greg Kroah-Hartman
2017-07-19 10:07 ` [PATCH 4.11 11/88] mlxsw: spectrum_router: Fix NULL pointer dereference Greg Kroah-Hartman
2017-07-19 10:07 ` [PATCH 4.11 12/88] rocker: move dereference before free Greg Kroah-Hartman
2017-07-19 10:07 ` [PATCH 4.11 13/88] bpf: prevent leaking pointer via xadd on unpriviledged Greg Kroah-Hartman
2017-07-19 10:07 ` [PATCH 4.11 15/88] net/mlx5: Cancel delayed recovery work when unloading the driver Greg Kroah-Hartman
2017-07-19 10:07 ` [PATCH 4.11 16/88] net/mlx5e: Fix TX carrier errors report in get stats ndo Greg Kroah-Hartman
2017-07-19 10:07 ` [PATCH 4.11 17/88] ipv6: dad: dont remove dynamic addresses if link is down Greg Kroah-Hartman
2017-07-19 10:07 ` [PATCH 4.11 18/88] vxlan: fix hlist corruption Greg Kroah-Hartman
2017-07-19 10:07 ` Greg Kroah-Hartman [this message]
2017-07-19 10:07 ` [PATCH 4.11 20/88] net: core: Fix slab-out-of-bounds in netdev_stats_to_stats64 Greg Kroah-Hartman
2017-07-19 10:07 ` [PATCH 4.11 21/88] liquidio: fix bug in soft reset failure detection Greg Kroah-Hartman
2017-07-19 10:07 ` [PATCH 4.11 23/88] vrf: fix bug_on triggered by rx when destroying a vrf Greg Kroah-Hartman
2017-07-19 10:07 ` [PATCH 4.11 24/88] rds: tcp: use sock_create_lite() to create the accept socket Greg Kroah-Hartman
2017-07-19 10:07 ` [PATCH 4.11 25/88] net/mlx5e: Initialize CEEs getpermhwaddr address buffer to 0xff Greg Kroah-Hartman
2017-07-19 10:07 ` [PATCH 4.11 26/88] cxgb4: fix BUG() on interrupt deallocating path of ULD Greg Kroah-Hartman
2017-07-19 10:07 ` [PATCH 4.11 27/88] tap: convert a mutex to a spinlock Greg Kroah-Hartman
2017-07-19 10:07 ` [PATCH 4.11 28/88] bridge: mdb: fix leak on complete_info ptr on fail path Greg Kroah-Hartman
2017-07-19 10:07 ` [PATCH 4.11 30/88] sfc: dont read beyond unicast address list Greg Kroah-Hartman
2017-07-19 10:07 ` [PATCH 4.11 31/88] Adding asm-prototypes.h for genksyms to generate crc Greg Kroah-Hartman
2017-07-19 10:07 ` [PATCH 4.11 32/88] sed regex in Makefile.build requires line break between exported symbols Greg Kroah-Hartman
2017-07-19 10:07 ` [PATCH 4.11 33/88] Adding the type of " Greg Kroah-Hartman
2017-07-19 10:07 ` [PATCH 4.11 34/88] sparc64: Fix gup_huge_pmd Greg Kroah-Hartman
2017-07-19 10:07 ` [PATCH 4.11 35/88] block: Fix a blk_exit_rl() regression Greg Kroah-Hartman
2017-07-19 10:07 ` [PATCH 4.11 36/88] brcmfmac: Fix a memory leak in error handling path in brcmf_cfg80211_attach Greg Kroah-Hartman
2017-07-19 10:07 ` [PATCH 4.11 37/88] brcmfmac: Fix glom_skb leak in brcmf_sdiod_recv_chain Greg Kroah-Hartman
2017-07-19 10:08 ` [PATCH 4.11 38/88] efi: Process the MEMATTR table only if EFI_MEMMAP is enabled Greg Kroah-Hartman
2017-07-19 10:08 ` [PATCH 4.11 39/88] cfg80211: Define nla_policy for NL80211_ATTR_LOCAL_MESH_POWER_MODE Greg Kroah-Hartman
2017-07-19 10:08 ` [PATCH 4.11 40/88] cfg80211: Validate frequencies nested in NL80211_ATTR_SCAN_FREQUENCIES Greg Kroah-Hartman
2017-07-19 10:08 ` [PATCH 4.11 41/88] cfg80211: Check if PMKID attribute is of expected size Greg Kroah-Hartman
2017-07-19 10:08 ` [PATCH 4.11 42/88] cfg80211: Check if NAN service ID " Greg Kroah-Hartman
2017-07-19 10:08 ` [PATCH 4.11 43/88] drm/amdgpu/gfx6: properly cache mc_arb_ramcfg Greg Kroah-Hartman
2017-07-19 10:08 ` [PATCH 4.11 44/88] irqchip/gic-v3: Fix out-of-bound access in gic_set_affinity Greg Kroah-Hartman
2017-07-19 10:08 ` [PATCH 4.11 45/88] parisc: Report SIGSEGV instead of SIGBUS when running out of stack Greg Kroah-Hartman
2017-07-19 10:08 ` [PATCH 4.11 46/88] parisc: use compat_sys_keyctl() Greg Kroah-Hartman
2017-07-19 10:08 ` [PATCH 4.11 47/88] parisc: DMA API: return error instead of BUG_ON for dma ops on non dma devs Greg Kroah-Hartman
2017-07-19 10:08 ` [PATCH 4.11 48/88] parisc/mm: Ensure IRQs are off in switch_mm() Greg Kroah-Hartman
2017-07-19 10:08 ` [PATCH 4.11 49/88] tools/lib/lockdep: Reduce MAX_LOCK_DEPTH to avoid overflowing lock_chain/: Depth Greg Kroah-Hartman
2017-07-19 10:08 ` [PATCH 4.11 50/88] thp, mm: fix crash due race in MADV_FREE handling Greg Kroah-Hartman
2017-07-19 10:08 ` [PATCH 4.11 51/88] kernel/extable.c: mark core_kernel_text notrace Greg Kroah-Hartman
2017-07-19 10:08 ` [PATCH 4.11 52/88] mm/list_lru.c: fix list_lru_count_node() to be race free Greg Kroah-Hartman
2017-07-19 10:08 ` [PATCH 4.11 53/88] fs/dcache.c: fix spin lockup issue on nlru->lock Greg Kroah-Hartman
2017-07-19 10:08 ` [PATCH 4.11 54/88] checkpatch: silence perl 5.26.0 unescaped left brace warnings Greg Kroah-Hartman
2017-07-19 10:08 ` [PATCH 4.11 55/88] binfmt_elf: use ELF_ET_DYN_BASE only for PIE Greg Kroah-Hartman
2017-07-19 10:08 ` [PATCH 4.11 56/88] arm: move ELF_ET_DYN_BASE to 4MB Greg Kroah-Hartman
2017-07-19 10:08 ` [PATCH 4.11 57/88] arm64: move ELF_ET_DYN_BASE to 4GB / 4MB Greg Kroah-Hartman
2017-07-19 10:08 ` [PATCH 4.11 58/88] powerpc: " Greg Kroah-Hartman
2017-07-19 10:08 ` [PATCH 4.11 59/88] s390: reduce ELF_ET_DYN_BASE Greg Kroah-Hartman
2017-07-19 10:08 ` [PATCH 4.11 60/88] exec: Limit arg stack to at most 75% of _STK_LIM Greg Kroah-Hartman
2017-07-19 10:08 ` [PATCH 4.11 61/88] powerpc/kexec: Fix radix to hash kexec due to IAMR/AMOR Greg Kroah-Hartman
2017-07-19 10:08 ` [PATCH 4.11 62/88] ARM64: dts: marvell: armada37xx: Fix timer interrupt specifiers Greg Kroah-Hartman
2017-07-19 10:08 ` [PATCH 4.11 63/88] arm64: Preventing READ_IMPLIES_EXEC propagation Greg Kroah-Hartman
2017-07-19 10:08 ` [PATCH 4.11 64/88] vt: fix unchecked __put_user() in tioclinux ioctls Greg Kroah-Hartman
2017-07-19 10:08 ` [PATCH 4.11 65/88] rcu: Add memory barriers for NOCB leader wakeup Greg Kroah-Hartman
2017-07-19 10:08 ` [PATCH 4.11 66/88] nvmem: core: fix leaks on registration errors Greg Kroah-Hartman
2017-07-19 10:08 ` [PATCH 4.11 67/88] Drivers: hv: vmbus: Close timing hole that can corrupt per-cpu page Greg Kroah-Hartman
2017-07-19 10:08 ` [PATCH 4.11 68/88] mnt: In umount propagation reparent in a separate pass Greg Kroah-Hartman
2017-07-19 10:08 ` [PATCH 4.11 69/88] mnt: In propgate_umount handle visiting mounts in any order Greg Kroah-Hartman
2017-07-19 10:08 ` [PATCH 4.11 70/88] mnt: Make propagate_umount less slow for overlapping mount propagation trees Greg Kroah-Hartman
2017-07-19 10:08 ` [PATCH 4.11 71/88] selftests/capabilities: Fix the test_execve test Greg Kroah-Hartman
2017-07-19 10:08 ` [PATCH 4.11 74/88] crypto: atmel - only treat EBUSY as transient if backlog Greg Kroah-Hartman
2017-07-19 10:08 ` [PATCH 4.11 75/88] crypto: sha1-ssse3 - Disable avx2 Greg Kroah-Hartman
2017-07-19 10:08 ` [PATCH 4.11 78/88] sched/fair, cpumask: Export for_each_cpu_wrap() Greg Kroah-Hartman
2017-07-19 10:08 ` [PATCH 4.11 79/88] sched/topology: Fix building of overlapping sched-groups Greg Kroah-Hartman
2017-07-19 10:08 ` [PATCH 4.11 80/88] sched/topology: Optimize build_group_mask() Greg Kroah-Hartman
2017-07-19 10:08 ` [PATCH 4.11 81/88] sched/topology: Fix overlapping sched_group_mask Greg Kroah-Hartman
2017-07-19 10:08 ` [PATCH 4.11 82/88] PM / wakeirq: Convert to SRCU Greg Kroah-Hartman
2017-07-19 10:08 ` [PATCH 4.11 84/88] PM / QoS: return -EINVAL for bogus strings Greg Kroah-Hartman
2017-07-19 10:08 ` [PATCH 4.11 88/88] kvm: vmx: allow host to access guest MSR_IA32_BNDCFGS Greg Kroah-Hartman
2017-07-19 10:27 ` [PATCH 4.11 00/88] 4.11.12-stable review Greg Kroah-Hartman
2017-07-19 20:34 ` Guenter Roeck
2017-07-19 23:38 ` Shuah Khan

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=20170719100823.450757532@linuxfoundation.org \
    --to=gregkh@linuxfoundation.org \
    --cc=davem@davemloft.net \
    --cc=jbenc@redhat.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linville@tuxdriver.com \
    --cc=stable@vger.kernel.org \
    /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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).