Commit cd80ab0c authored by Gerhard Stenzel's avatar Gerhard Stenzel Committed by Greg Kroah-Hartman

vxlan: fix incorrect initializer in union vxlan_addr

[ Upstream commit a45e92a5 ]

The first initializer in the following

        union vxlan_addr ipa = {
            .sin.sin_addr.s_addr = tip,
            .sa.sa_family = AF_INET,
        };

is optimised away by the compiler, due to the second initializer,
therefore initialising .sin.sin_addr.s_addr always to 0.
This results in netlink messages indicating a L3 miss never contain the
missed IP address. This was observed with GCC 4.8 and 4.9. I do not know about previous versions.
The problem affects user space programs relying on an IP address being
sent as part of a netlink message indicating a L3 miss.

Changing
            .sa.sa_family = AF_INET,
to
            .sin.sin_family = AF_INET,
fixes the problem.
Signed-off-by: default avatarGerhard Stenzel <gerhard.stenzel@de.ibm.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 18460f5f
...@@ -1325,7 +1325,7 @@ static int arp_reduce(struct net_device *dev, struct sk_buff *skb) ...@@ -1325,7 +1325,7 @@ static int arp_reduce(struct net_device *dev, struct sk_buff *skb)
} else if (vxlan->flags & VXLAN_F_L3MISS) { } else if (vxlan->flags & VXLAN_F_L3MISS) {
union vxlan_addr ipa = { union vxlan_addr ipa = {
.sin.sin_addr.s_addr = tip, .sin.sin_addr.s_addr = tip,
.sa.sa_family = AF_INET, .sin.sin_family = AF_INET,
}; };
vxlan_ip_miss(dev, &ipa); vxlan_ip_miss(dev, &ipa);
...@@ -1486,7 +1486,7 @@ static int neigh_reduce(struct net_device *dev, struct sk_buff *skb) ...@@ -1486,7 +1486,7 @@ static int neigh_reduce(struct net_device *dev, struct sk_buff *skb)
} else if (vxlan->flags & VXLAN_F_L3MISS) { } else if (vxlan->flags & VXLAN_F_L3MISS) {
union vxlan_addr ipa = { union vxlan_addr ipa = {
.sin6.sin6_addr = msg->target, .sin6.sin6_addr = msg->target,
.sa.sa_family = AF_INET6, .sin6.sin6_family = AF_INET6,
}; };
vxlan_ip_miss(dev, &ipa); vxlan_ip_miss(dev, &ipa);
...@@ -1519,7 +1519,7 @@ static bool route_shortcircuit(struct net_device *dev, struct sk_buff *skb) ...@@ -1519,7 +1519,7 @@ static bool route_shortcircuit(struct net_device *dev, struct sk_buff *skb)
if (!n && (vxlan->flags & VXLAN_F_L3MISS)) { if (!n && (vxlan->flags & VXLAN_F_L3MISS)) {
union vxlan_addr ipa = { union vxlan_addr ipa = {
.sin.sin_addr.s_addr = pip->daddr, .sin.sin_addr.s_addr = pip->daddr,
.sa.sa_family = AF_INET, .sin.sin_family = AF_INET,
}; };
vxlan_ip_miss(dev, &ipa); vxlan_ip_miss(dev, &ipa);
...@@ -1540,7 +1540,7 @@ static bool route_shortcircuit(struct net_device *dev, struct sk_buff *skb) ...@@ -1540,7 +1540,7 @@ static bool route_shortcircuit(struct net_device *dev, struct sk_buff *skb)
if (!n && (vxlan->flags & VXLAN_F_L3MISS)) { if (!n && (vxlan->flags & VXLAN_F_L3MISS)) {
union vxlan_addr ipa = { union vxlan_addr ipa = {
.sin6.sin6_addr = pip6->daddr, .sin6.sin6_addr = pip6->daddr,
.sa.sa_family = AF_INET6, .sin6.sin6_family = AF_INET6,
}; };
vxlan_ip_miss(dev, &ipa); vxlan_ip_miss(dev, &ipa);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment