vxlan: fix incorrect initializer in union vxlan_addr
Subsystems (2)
A message that is not in the archive (sent off-list or not yet received): [email protected]
PATCH 1/1 vxlan: fix incorrect initializer in union vxlan_addr
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.
---
drivers/net/vxlan.c +0 -0
@@ -1327,7 +1327,7 @@ static int arp_reduce(struct net_device *dev,
struct sk_buff *skb)
} else if (vxlan->flags & VXLAN_F_L3MISS) {
union vxlan_addr ipa = {
.sin.sin_addr.s_addr = tip,
- .sa.sa_family = AF_INET,
+ .sin.sin_family = AF_INET,
};
vxlan_ip_miss(dev, &ipa);
@@ -1488,7 +1488,7 @@ static int neigh_reduce(struct net_device *dev, struct sk_buff *skb)
} else if (vxlan->flags & VXLAN_F_L3MISS) {
union vxlan_addr ipa = {
.sin6.sin6_addr = msg->target,
- .sa.sa_family = AF_INET6,
+ .sin6.sin6_family = AF_INET6,
};
vxlan_ip_miss(dev, &ipa);
@@ -1521,7 +1521,7 @@ static bool route_shortcircuit(struct net_device *dev, struct sk_buff *skb)
if (!n && (vxlan->flags & VXLAN_F_L3MISS)) {
union vxlan_addr ipa = {
.sin.sin_addr.s_addr = pip->daddr,
- .sa.sa_family = AF_INET,
+ .sin.sin_family = AF_INET,
};
vxlan_ip_miss(dev, &ipa);
@@ -1542,7 +1542,7 @@ static bool route_shortcircuit(struct net_device *dev, struct sk_buff *skb)
if (!n && (vxlan->flags & VXLAN_F_L3MISS)) {
union vxlan_addr ipa = {
.sin6.sin6_addr = pip6->daddr,
- .sa.sa_family = AF_INET6,
+ .sin6.sin6_family = AF_INET6,
};
vxlan_ip_miss(dev, &ipa);
Quoted 16 lines · Gerhard Stenzel
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.
Quoted 5 lines
Changing
.sa.sa_family =AF_INET,
to
.sin.sin_family =AF_INET,
fixes the problem.
So GCC can't figure out we are initializing different parts of this union through
different members... Or maybe we should not use initializer at all.
Anyway,
David Miller
maintainerFrom: Gerhard Stenzel <[email protected]>
Date: Fri, 15 Aug 2014 11:03:58 +0200
Quoted 17 lines
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.
Quoted 7 lines
Changing
.sa.sa_family =AF_INET,
to
.sin.sin_family =AF_INET,
fixes the problem.Signed-off-by Gerhard Stenzel <[email protected]>
Your patch was corrupted by your email client, also please do not indent your signoff.
THanks.
Trying again ...
On 08/18/2014 07:11 PM, David Miller wrote:
...
Quoted 6 lines
Your patch was corrupted by your email client, also please do not indent your signoff.
THanks.
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.
---
drivers/net/vxlan.c +4 -4
@@ -1327,7 +1327,7 @@ static int arp_reduce(struct net_device *dev, struct sk_buff *skb) }else if (vxlan->flags &VXLAN_F_L3MISS ) {union vxlan_addr ipa = { .sin.sin_addr.s_addr = tip, - .sa.sa_family =AF_INET , + .sin.sin_family =AF_INET , };vxlan_ip_miss (dev, &ipa);
@@ -1488,7 +1488,7 @@ static int neigh_reduce(struct net_device *dev, struct sk_buff *skb) }else if (vxlan->flags &VXLAN_F_L3MISS ) {union vxlan_addr ipa = { .sin6.sin6_addr = msg->target, - .sa.sa_family =AF_INET6 , + .sin6.sin6_family =AF_INET6 , };vxlan_ip_miss (dev, &ipa);
@@ -1521,7 +1521,7 @@ static bool route_shortcircuit(struct net_device *dev, struct sk_buff *skb)if (!n && (vxlan->flags &VXLAN_F_L3MISS )) {union vxlan_addr ipa = { .sin.sin_addr.s_addr = pip->daddr, - .sa.sa_family =AF_INET , + .sin.sin_family =AF_INET , };vxlan_ip_miss (dev, &ipa);
@@ -1542,7 +1542,7 @@ static bool route_shortcircuit(struct net_device *dev, struct sk_buff *skb)if (!n && (vxlan->flags &VXLAN_F_L3MISS )) {union vxlan_addr ipa = { .sin6.sin6_addr = pip6->daddr, - .sa.sa_family =AF_INET6 , + .sin6.sin6_family =AF_INET6 , };vxlan_ip_miss (dev, &ipa);
David Miller
maintainerFrom: Gerhard Stenzel <[email protected]>
Date: Tue, 19 Aug 2014 22:36:43 +0200
Quoted 1 line
Trying again ...
This is not the correct way to resubmit a patch properly.
Do not ever submit a new copy of a patch as a reply to a discussion thread, quoting unrelated material, etc.
Instead, make a new, fresh, mailing list posting as if you were posting the patch for the first time. Except you add "[PATCH v2 net]" or similar to indicate this is a new submission of the patch.