| From foo@baz Tue Aug 8 16:51:58 PDT 2017 |
| From: WANG Cong <xiyou.wangcong@gmail.com> |
| Date: Thu, 20 Jul 2017 11:27:57 -0700 |
| Subject: rtnetlink: allocate more memory for dev_set_mac_address() |
| |
| From: WANG Cong <xiyou.wangcong@gmail.com> |
| |
| |
| [ Upstream commit 153711f9421be5dbc973dc57a4109dc9d54c89b1 ] |
| |
| 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> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| --- |
| net/core/rtnetlink.c | 3 ++- |
| 1 file changed, 2 insertions(+), 1 deletion(-) |
| |
| --- a/net/core/rtnetlink.c |
| +++ b/net/core/rtnetlink.c |
| @@ -1742,7 +1742,8 @@ static int do_setlink(const struct sk_bu |
| 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; |