Wed, Apr 26, 2017 at 07:03:23AM CEST, xiyou.wangc...@gmail.com wrote:
>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.
>
>Reported-by: Andrey Konovalov <andreyk...@google.com>
>Cc: Jiri Pirko <j...@resnulli.us>
>Signed-off-by: Cong Wang <xiyou.wangc...@gmail.com>
>---
> drivers/net/team/team.c | 9 ++++++---
> 1 file changed, 6 insertions(+), 3 deletions(-)
>
>diff --git a/drivers/net/team/team.c b/drivers/net/team/team.c
>index 85c0124..88878f1 100644
>--- a/drivers/net/team/team.c
>+++ b/drivers/net/team/team.c
>@@ -60,10 +60,13 @@ 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 {
>+              unsigned short type;
>+              unsigned char addr[MAX_ADDR_LEN];
>+      } addr;

Wouldn't it make sense to define this struct somewhere in the core
headers?


> 
>-      memcpy(addr.sa_data, dev_addr, port_dev->addr_len);
>-      addr.sa_family = port_dev->type;
>+      memcpy(addr.addr, dev_addr, port_dev->addr_len);
>+      addr.type = port_dev->type;
>       return dev_set_mac_address(port_dev, &addr);
> }
> 
>-- 
>2.5.5
>

Reply via email to