Re: [PATCH 7/7] rtnetlink: do_setlink: Use struct sockaddr_storage
"Gustavo A. R. Silva" <[email protected]> Tue, 20 May 2025 16:50:29 -0600
| Newsgroups | org.kernel.vger.linux-wpan,org.infradead.lists.linux-nvme,org.kernel.vger.linux-hardening,org.kernel.vger.linux-hyperv,org.kernel.vger.linux-kernel,org.kernel.vger.linux-scsi,org.kernel.vger.linux-usb,org.kernel.vger.netdev,org.kernel.vger.target-devel |
|---|---|
| Message-ID | <[email protected]> |
On 20/05/25 16:31, Kees Cook wrote: > Instead of a heap allocating a variably sized struct sockaddr and lying > about the type in the call to netif_set_mac_address(), use a stack > allocated struct sockaddr_storage. This lets us drop the cast and avoid > the allocation. > > Putting "ss" on the stack means it will get a reused stack slot since > it is the same size (128B) as other existing single-scope stack variables, > like the vfinfo array (128B), so no additional stack space is used by > this function. > > Signed-off-by: Kees Cook <[email protected]> Acked-by: Gustavo A. R. Silva <[email protected]> Thanks! -Gustavo > --- > Cc: Kuniyuki Iwashima <[email protected]> > Cc: Eric Dumazet <[email protected]> > Cc: Jakub Kicinski <[email protected]> > Cc: "David S. Miller" <[email protected]> > Cc: Paolo Abeni <[email protected]> > Cc: Simon Horman <[email protected]> > Cc: Ido Schimmel <[email protected]> > Cc: <[email protected]> > --- > net/core/rtnetlink.c | 19 ++++--------------- > 1 file changed, 4 insertions(+), 15 deletions(-) > > diff --git a/net/core/rtnetlink.c b/net/core/rtnetlink.c > index 9743f1c2ae3c..f9a35bdc58ad 100644 > --- a/net/core/rtnetlink.c > +++ b/net/core/rtnetlink.c > @@ -3080,17 +3080,7 @@ static int do_setlink(const struct sk_buff *skb, struct net_device *dev, > } > > if (tb[IFLA_ADDRESS]) { > - struct sockaddr *sa; > - int len; > - > - len = sizeof(sa_family_t) + max_t(size_t, dev->addr_len, > - sizeof(*sa)); > - sa = kmalloc(len, GFP_KERNEL); > - if (!sa) { > - err = -ENOMEM; > - goto errout; > - } > - sa->sa_family = dev->type; > + struct sockaddr_storage ss = { }; > > netdev_unlock_ops(dev); > > @@ -3098,10 +3088,9 @@ static int do_setlink(const struct sk_buff *skb, struct net_device *dev, > down_write(&dev_addr_sem); > netdev_lock_ops(dev); > > - memcpy(sa->sa_data, nla_data(tb[IFLA_ADDRESS]), > - dev->addr_len); > - err = netif_set_mac_address(dev, (struct sockaddr_storage *)sa, extack); > - kfree(sa); > + ss.ss_family = dev->type; > + memcpy(ss.__data, nla_data(tb[IFLA_ADDRESS]), dev->addr_len); > + err = netif_set_mac_address(dev, &ss, extack); > if (err) { > up_write(&dev_addr_sem); > goto errout;