Re: [Patch net v2] team: use a larger struct for mac address

2017-07-29 Thread David Miller
From: Cong Wang 
Date: Wed, 26 Jul 2017 15:22:07 -0700

> IPv6 tunnels use sizeof(struct in6_addr) as dev->addr_len,
> but in many places especially bonding, we use struct sockaddr
> to copy and set mac addr, this could lead to stack out-of-bounds
> access.
> 
> Fix it by using a larger address storage like bonding.
> 
> Reported-by: Andrey Konovalov 
> Cc: Jiri Pirko 
> Signed-off-by: Cong Wang 

Applied.


[Patch net v2] team: use a larger struct for mac address

2017-07-26 Thread Cong Wang
IPv6 tunnels use sizeof(struct in6_addr) as dev->addr_len,
but in many places especially bonding, we use struct sockaddr
to copy and set mac addr, this could lead to stack out-of-bounds
access.

Fix it by using a larger address storage like bonding.

Reported-by: Andrey Konovalov 
Cc: Jiri Pirko 
Signed-off-by: Cong Wang 
---
 drivers/net/team/team.c | 8 
 1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/drivers/net/team/team.c b/drivers/net/team/team.c
index 464570409796..ae53e899259f 100644
--- a/drivers/net/team/team.c
+++ b/drivers/net/team/team.c
@@ -60,11 +60,11 @@ static struct team_port *team_port_get_rtnl(const struct 
net_device *dev)
 static int __set_port_dev_addr(struct net_device *port_dev,
   const unsigned char *dev_addr)
 {
-   struct sockaddr addr;
+   struct sockaddr_storage addr;
 
-   memcpy(addr.sa_data, dev_addr, port_dev->addr_len);
-   addr.sa_family = port_dev->type;
-   return dev_set_mac_address(port_dev, );
+   memcpy(addr.__data, dev_addr, port_dev->addr_len);
+   addr.ss_family = port_dev->type;
+   return dev_set_mac_address(port_dev, (struct sockaddr *));
 }
 
 static int team_port_set_orig_dev_addr(struct team_port *port)
-- 
2.13.0