rtnetlink: allocate more memory for dev_set_mac_address()
authorWANG Cong <xiyou.wangcong@gmail.com>
Thu, 20 Jul 2017 18:27:57 +0000 (11:27 -0700)
committerDavid S. Miller <davem@davemloft.net>
Thu, 20 Jul 2017 22:23:22 +0000 (15:23 -0700)
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>
net/core/rtnetlink.c

index 11b25fbf3dd29d92ed496eaf951ffe21c18e2cfe..9201e3621351144f1fde497dfa1025d93d0a76f9 100644 (file)
@@ -2031,7 +2031,8 @@ static int do_setlink(const struct sk_buff *skb,
                struct sockaddr *sa;
                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);
                if (!sa) {
                        err = -ENOMEM;