Browse Source

rtnetlink: allocate more memory for dev_set_mac_address()

virtnet_set_mac_address() interprets mac address as struct
sockaddr, but upper layer only allocates dev->addr_len
which is ETH_ALEN + sizeof(sa_family_t) in this case.

We lack a unified definition for mac address, so just fix
the upper layer, this also allows drivers to interpret it
to struct sockaddr freely.

Reported-by: David Ahern <dsahern@gmail.com>
Signed-off-by: Cong Wang <xiyou.wangcong@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
WANG Cong 8 years ago
parent
commit
153711f942
1 changed files with 2 additions and 1 deletions
  1. 2 1
      net/core/rtnetlink.c

+ 2 - 1
net/core/rtnetlink.c

@@ -2031,7 +2031,8 @@ static int do_setlink(const struct sk_buff *skb,
 		struct sockaddr *sa;
 		struct sockaddr *sa;
 		int len;
 		int len;
 
 
-		len = sizeof(sa_family_t) + dev->addr_len;
+		len = sizeof(sa_family_t) + max_t(size_t, dev->addr_len,
+						  sizeof(*sa));
 		sa = kmalloc(len, GFP_KERNEL);
 		sa = kmalloc(len, GFP_KERNEL);
 		if (!sa) {
 		if (!sa) {
 			err = -ENOMEM;
 			err = -ENOMEM;