summaryrefslogtreecommitdiffstats
path: root/include/net
diff options
context:
space:
mode:
authorJiri Benc <jbenc@redhat.com>2017-07-02 19:00:57 +0200
committerDavid S. Miller <davem@davemloft.net>2017-07-03 11:36:27 +0200
commit69e766612c4bcb79e19cebed9eed61d4222c1d47 (patch)
tree7ef24b9e346f32e0c16ebd8ada4c4ed22a18c647 /include/net
parentnet/mlxfw: Properly handle dependancy with non-loadable mlx5 (diff)
downloadlinux-69e766612c4bcb79e19cebed9eed61d4222c1d47.tar.xz
linux-69e766612c4bcb79e19cebed9eed61d4222c1d47.zip
vxlan: fix hlist corruption
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: b1be00a6c39f ("vxlan: support both IPv4 and IPv6 sockets in a single vxlan device") Signed-off-by: Jiri Benc <jbenc@redhat.com> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'include/net')
-rw-r--r--include/net/vxlan.h10
1 files changed, 9 insertions, 1 deletions
diff --git a/include/net/vxlan.h b/include/net/vxlan.h
index b816a0a6686e..326e8498b10e 100644
--- a/include/net/vxlan.h
+++ b/include/net/vxlan.h
@@ -221,9 +221,17 @@ struct vxlan_config {
bool no_share;
};
+struct vxlan_dev_node {
+ struct hlist_node hlist;
+ struct vxlan_dev *vxlan;
+};
+
/* Pseudo network device */
struct vxlan_dev {
- struct hlist_node hlist; /* vni hash table */
+ struct vxlan_dev_node hlist4; /* vni hash table for IPv4 socket */
+#if IS_ENABLED(CONFIG_IPV6)
+ struct vxlan_dev_node hlist6; /* vni hash table for IPv6 socket */
+#endif
struct list_head next; /* vxlan's per namespace list */
struct vxlan_sock __rcu *vn4_sock; /* listening socket for IPv4 */
#if IS_ENABLED(CONFIG_IPV6)