lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [thread-next>] [day] [month] [year] [list]
Date:	Fri, 15 Aug 2014 11:03:58 +0200
From:	Gerhard Stenzel <gstenzel@...ux.vnet.ibm.com>
To:	netdev@...r.kernel.org
Subject: [PATCH net] 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.

     Signed-off-by: Gerhard Stenzel <gerhard.stenzel@...ibm.com>

---

diff --git a/drivers/net/vxlan.c b/drivers/net/vxlan.c
index 1fb7b37..beb377b 100644
--- a/drivers/net/vxlan.c
+++ b/drivers/net/vxlan.c
@@ -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);


--
To unsubscribe from this list: send the line "unsubscribe netdev" in
the body of a message to majordomo@...r.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ