diff mbox

[net] rtnetlink: allocate more memory for dev_set_mac_address()

Message ID 20170720182758.20204-1-xiyou.wangcong@gmail.com
State Accepted, archived
Delegated to: David Miller
Headers show

Commit Message

Cong Wang July 20, 2017, 6:27 p.m. UTC
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>
---
 net/core/rtnetlink.c | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

Comments

David Miller July 20, 2017, 10:23 p.m. UTC | #1
From: Cong Wang <xiyou.wangcong@gmail.com>
Date: Thu, 20 Jul 2017 11:27:57 -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>

Applied and queued up for -stable, thanks Cong.
diff mbox

Patch

diff --git a/net/core/rtnetlink.c b/net/core/rtnetlink.c
index d1ba90980be1..ebaa26cf777f 100644
--- a/net/core/rtnetlink.c
+++ b/net/core/rtnetlink.c
@@ -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;