Skip to content

Commit 358bea9

Browse files
author
Paolo Abeni
committed
Merge branch 'net-convert-dev_set_mac_address-to-struct-sockaddr_storage'
Kees Cook says: ==================== net: Convert dev_set_mac_address() to struct sockaddr_storage As part of the effort to allow the compiler to reason about object sizes, we need to deal with the problematic variably sized struct sockaddr, which has no internal runtime size tracking. In much of the network stack the use of struct sockaddr_storage has been adopted. Continue the transition toward this for more of the internal APIs. Specifically: - inet_addr_is_any() - netif_set_mac_address() - dev_set_mac_address() - dev_set_mac_address_user() Only a few callers of dev_set_mac_address() needed adjustment; all others were already using struct sockaddr_storage internally. v1: https://lore.kernel.org/all/[email protected]/ ==================== Link: https://patch.msgid.link/[email protected] Signed-off-by: Paolo Abeni <[email protected]>
2 parents 5bccdc5 + ae9fcd5 commit 358bea9

File tree

21 files changed

+109
-109
lines changed

21 files changed

+109
-109
lines changed

drivers/net/bonding/bond_alb.c

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1035,7 +1035,7 @@ static int alb_set_slave_mac_addr(struct slave *slave, const u8 addr[],
10351035
*/
10361036
memcpy(ss.__data, addr, len);
10371037
ss.ss_family = dev->type;
1038-
if (dev_set_mac_address(dev, (struct sockaddr *)&ss, NULL)) {
1038+
if (dev_set_mac_address(dev, &ss, NULL)) {
10391039
slave_err(slave->bond->dev, dev, "dev_set_mac_address on slave failed! ALB mode requires that the base driver support setting the hw address also when the network device's interface is open\n");
10401040
return -EOPNOTSUPP;
10411041
}
@@ -1273,8 +1273,7 @@ static int alb_set_mac_address(struct bonding *bond, void *addr)
12731273
break;
12741274
bond_hw_addr_copy(tmp_addr, rollback_slave->dev->dev_addr,
12751275
rollback_slave->dev->addr_len);
1276-
dev_set_mac_address(rollback_slave->dev,
1277-
(struct sockaddr *)&ss, NULL);
1276+
dev_set_mac_address(rollback_slave->dev, &ss, NULL);
12781277
dev_addr_set(rollback_slave->dev, tmp_addr);
12791278
}
12801279

@@ -1763,8 +1762,7 @@ void bond_alb_handle_active_change(struct bonding *bond, struct slave *new_slave
17631762
bond->dev->addr_len);
17641763
ss.ss_family = bond->dev->type;
17651764
/* we don't care if it can't change its mac, best effort */
1766-
dev_set_mac_address(new_slave->dev, (struct sockaddr *)&ss,
1767-
NULL);
1765+
dev_set_mac_address(new_slave->dev, &ss, NULL);
17681766

17691767
dev_addr_set(new_slave->dev, tmp_addr);
17701768
}

drivers/net/bonding/bond_main.c

Lines changed: 6 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1112,8 +1112,7 @@ static void bond_do_fail_over_mac(struct bonding *bond,
11121112
ss.ss_family = bond->dev->type;
11131113
}
11141114

1115-
rv = dev_set_mac_address(new_active->dev,
1116-
(struct sockaddr *)&ss, NULL);
1115+
rv = dev_set_mac_address(new_active->dev, &ss, NULL);
11171116
if (rv) {
11181117
slave_err(bond->dev, new_active->dev, "Error %d setting MAC of new active slave\n",
11191118
-rv);
@@ -1127,8 +1126,7 @@ static void bond_do_fail_over_mac(struct bonding *bond,
11271126
new_active->dev->addr_len);
11281127
ss.ss_family = old_active->dev->type;
11291128

1130-
rv = dev_set_mac_address(old_active->dev,
1131-
(struct sockaddr *)&ss, NULL);
1129+
rv = dev_set_mac_address(old_active->dev, &ss, NULL);
11321130
if (rv)
11331131
slave_err(bond->dev, old_active->dev, "Error %d setting MAC of old active slave\n",
11341132
-rv);
@@ -2127,7 +2125,7 @@ int bond_enslave(struct net_device *bond_dev, struct net_device *slave_dev,
21272125
}
21282126

21292127
ss.ss_family = slave_dev->type;
2130-
res = dev_set_mac_address(slave_dev, (struct sockaddr *)&ss, extack);
2128+
res = dev_set_mac_address(slave_dev, &ss, extack);
21312129
if (res) {
21322130
slave_err(bond_dev, slave_dev, "Error %d calling set_mac_address\n", res);
21332131
goto err_restore_mtu;
@@ -2455,7 +2453,7 @@ int bond_enslave(struct net_device *bond_dev, struct net_device *slave_dev,
24552453
bond_hw_addr_copy(ss.__data, new_slave->perm_hwaddr,
24562454
new_slave->dev->addr_len);
24572455
ss.ss_family = slave_dev->type;
2458-
dev_set_mac_address(slave_dev, (struct sockaddr *)&ss, NULL);
2456+
dev_set_mac_address(slave_dev, &ss, NULL);
24592457
}
24602458

24612459
err_restore_mtu:
@@ -2649,7 +2647,7 @@ static int __bond_release_one(struct net_device *bond_dev,
26492647
bond_hw_addr_copy(ss.__data, slave->perm_hwaddr,
26502648
slave->dev->addr_len);
26512649
ss.ss_family = slave_dev->type;
2652-
dev_set_mac_address(slave_dev, (struct sockaddr *)&ss, NULL);
2650+
dev_set_mac_address(slave_dev, &ss, NULL);
26532651
}
26542652

26552653
if (unregister) {
@@ -4936,8 +4934,7 @@ static int bond_set_mac_address(struct net_device *bond_dev, void *addr)
49364934
if (rollback_slave == slave)
49374935
break;
49384936

4939-
tmp_res = dev_set_mac_address(rollback_slave->dev,
4940-
(struct sockaddr *)&tmp_ss, NULL);
4937+
tmp_res = dev_set_mac_address(rollback_slave->dev, &tmp_ss, NULL);
49414938
if (tmp_res) {
49424939
slave_dbg(bond_dev, rollback_slave->dev, "%s: unwind err %d\n",
49434940
__func__, tmp_res);

drivers/net/hyperv/netvsc_drv.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1371,7 +1371,7 @@ static int netvsc_set_mac_addr(struct net_device *ndev, void *p)
13711371
struct net_device_context *ndc = netdev_priv(ndev);
13721372
struct net_device *vf_netdev = rtnl_dereference(ndc->vf_netdev);
13731373
struct netvsc_device *nvdev = rtnl_dereference(ndc->nvdev);
1374-
struct sockaddr *addr = p;
1374+
struct sockaddr_storage *addr = p;
13751375
int err;
13761376

13771377
err = eth_prepare_mac_addr_change(ndev, p);
@@ -1387,12 +1387,12 @@ static int netvsc_set_mac_addr(struct net_device *ndev, void *p)
13871387
return err;
13881388
}
13891389

1390-
err = rndis_filter_set_device_mac(nvdev, addr->sa_data);
1390+
err = rndis_filter_set_device_mac(nvdev, addr->__data);
13911391
if (!err) {
13921392
eth_commit_mac_addr_change(ndev, p);
13931393
} else if (vf_netdev) {
13941394
/* rollback change on VF */
1395-
memcpy(addr->sa_data, ndev->dev_addr, ETH_ALEN);
1395+
memcpy(addr->__data, ndev->dev_addr, ETH_ALEN);
13961396
dev_set_mac_address(vf_netdev, addr, NULL);
13971397
}
13981398

drivers/net/macvlan.c

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -754,24 +754,24 @@ static int macvlan_sync_address(struct net_device *dev,
754754
static int macvlan_set_mac_address(struct net_device *dev, void *p)
755755
{
756756
struct macvlan_dev *vlan = netdev_priv(dev);
757-
struct sockaddr *addr = p;
757+
struct sockaddr_storage *addr = p;
758758

759-
if (!is_valid_ether_addr(addr->sa_data))
759+
if (!is_valid_ether_addr(addr->__data))
760760
return -EADDRNOTAVAIL;
761761

762762
/* If the addresses are the same, this is a no-op */
763-
if (ether_addr_equal(dev->dev_addr, addr->sa_data))
763+
if (ether_addr_equal(dev->dev_addr, addr->__data))
764764
return 0;
765765

766766
if (vlan->mode == MACVLAN_MODE_PASSTHRU) {
767767
macvlan_set_addr_change(vlan->port);
768768
return dev_set_mac_address(vlan->lowerdev, addr, NULL);
769769
}
770770

771-
if (macvlan_addr_busy(vlan->port, addr->sa_data))
771+
if (macvlan_addr_busy(vlan->port, addr->__data))
772772
return -EADDRINUSE;
773773

774-
return macvlan_sync_address(dev, addr->sa_data);
774+
return macvlan_sync_address(dev, addr->__data);
775775
}
776776

777777
static void macvlan_change_rx_flags(struct net_device *dev, int change)
@@ -1295,11 +1295,11 @@ static void macvlan_port_destroy(struct net_device *dev)
12951295
*/
12961296
if (macvlan_passthru(port) &&
12971297
!ether_addr_equal(port->dev->dev_addr, port->perm_addr)) {
1298-
struct sockaddr sa;
1298+
struct sockaddr_storage ss;
12991299

1300-
sa.sa_family = port->dev->type;
1301-
memcpy(&sa.sa_data, port->perm_addr, port->dev->addr_len);
1302-
dev_set_mac_address(port->dev, &sa, NULL);
1300+
ss.ss_family = port->dev->type;
1301+
memcpy(&ss.__data, port->perm_addr, port->dev->addr_len);
1302+
dev_set_mac_address(port->dev, &ss, NULL);
13031303
}
13041304

13051305
kfree(port);

drivers/net/tap.c

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -923,7 +923,7 @@ static long tap_ioctl(struct file *file, unsigned int cmd,
923923
unsigned int __user *up = argp;
924924
unsigned short u;
925925
int __user *sp = argp;
926-
struct sockaddr sa;
926+
struct sockaddr_storage ss;
927927
int s;
928928
int ret;
929929

@@ -1000,24 +1000,28 @@ static long tap_ioctl(struct file *file, unsigned int cmd,
10001000
return -ENOLINK;
10011001
}
10021002
ret = 0;
1003-
dev_get_mac_address(&sa, dev_net(tap->dev), tap->dev->name);
1003+
dev_get_mac_address((struct sockaddr *)&ss, dev_net(tap->dev),
1004+
tap->dev->name);
10041005
if (copy_to_user(&ifr->ifr_name, tap->dev->name, IFNAMSIZ) ||
1005-
copy_to_user(&ifr->ifr_hwaddr, &sa, sizeof(sa)))
1006+
copy_to_user(&ifr->ifr_hwaddr, &ss, sizeof(ifr->ifr_hwaddr)))
10061007
ret = -EFAULT;
10071008
tap_put_tap_dev(tap);
10081009
rtnl_unlock();
10091010
return ret;
10101011

10111012
case SIOCSIFHWADDR:
1012-
if (copy_from_user(&sa, &ifr->ifr_hwaddr, sizeof(sa)))
1013+
if (copy_from_user(&ss, &ifr->ifr_hwaddr, sizeof(ifr->ifr_hwaddr)))
10131014
return -EFAULT;
10141015
rtnl_lock();
10151016
tap = tap_get_tap_dev(q);
10161017
if (!tap) {
10171018
rtnl_unlock();
10181019
return -ENOLINK;
10191020
}
1020-
ret = dev_set_mac_address_user(tap->dev, &sa, NULL);
1021+
if (tap->dev->addr_len > sizeof(ifr->ifr_hwaddr))
1022+
ret = -EINVAL;
1023+
else
1024+
ret = dev_set_mac_address_user(tap->dev, &ss, NULL);
10211025
tap_put_tap_dev(tap);
10221026
rtnl_unlock();
10231027
return ret;

drivers/net/team/team_core.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ static int __set_port_dev_addr(struct net_device *port_dev,
5555

5656
memcpy(addr.__data, dev_addr, port_dev->addr_len);
5757
addr.ss_family = port_dev->type;
58-
return dev_set_mac_address(port_dev, (struct sockaddr *)&addr, NULL);
58+
return dev_set_mac_address(port_dev, &addr, NULL);
5959
}
6060

6161
static int team_port_set_orig_dev_addr(struct team_port *port)

drivers/net/tun.c

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3193,7 +3193,13 @@ static long __tun_chr_ioctl(struct file *file, unsigned int cmd,
31933193

31943194
case SIOCSIFHWADDR:
31953195
/* Set hw address */
3196-
ret = dev_set_mac_address_user(tun->dev, &ifr.ifr_hwaddr, NULL);
3196+
if (tun->dev->addr_len > sizeof(ifr.ifr_hwaddr)) {
3197+
ret = -EINVAL;
3198+
break;
3199+
}
3200+
ret = dev_set_mac_address_user(tun->dev,
3201+
(struct sockaddr_storage *)&ifr.ifr_hwaddr,
3202+
NULL);
31973203
break;
31983204

31993205
case TUNGETSNDBUF:

drivers/net/usb/r8152.c

Lines changed: 27 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1665,14 +1665,14 @@ static int
16651665
rtl8152_set_speed(struct r8152 *tp, u8 autoneg, u32 speed, u8 duplex,
16661666
u32 advertising);
16671667

1668-
static int __rtl8152_set_mac_address(struct net_device *netdev, void *p,
1668+
static int __rtl8152_set_mac_address(struct net_device *netdev,
1669+
struct sockaddr_storage *addr,
16691670
bool in_resume)
16701671
{
16711672
struct r8152 *tp = netdev_priv(netdev);
1672-
struct sockaddr *addr = p;
16731673
int ret = -EADDRNOTAVAIL;
16741674

1675-
if (!is_valid_ether_addr(addr->sa_data))
1675+
if (!is_valid_ether_addr(addr->__data))
16761676
goto out1;
16771677

16781678
if (!in_resume) {
@@ -1683,10 +1683,10 @@ static int __rtl8152_set_mac_address(struct net_device *netdev, void *p,
16831683

16841684
mutex_lock(&tp->control);
16851685

1686-
eth_hw_addr_set(netdev, addr->sa_data);
1686+
eth_hw_addr_set(netdev, addr->__data);
16871687

16881688
ocp_write_byte(tp, MCU_TYPE_PLA, PLA_CRWECR, CRWECR_CONFIG);
1689-
pla_ocp_write(tp, PLA_IDR, BYTE_EN_SIX_BYTES, 8, addr->sa_data);
1689+
pla_ocp_write(tp, PLA_IDR, BYTE_EN_SIX_BYTES, 8, addr->__data);
16901690
ocp_write_byte(tp, MCU_TYPE_PLA, PLA_CRWECR, CRWECR_NORAML);
16911691

16921692
mutex_unlock(&tp->control);
@@ -1706,7 +1706,8 @@ static int rtl8152_set_mac_address(struct net_device *netdev, void *p)
17061706
* host system provided MAC address.
17071707
* Examples of this are Dell TB15 and Dell WD15 docks
17081708
*/
1709-
static int vendor_mac_passthru_addr_read(struct r8152 *tp, struct sockaddr *sa)
1709+
static int vendor_mac_passthru_addr_read(struct r8152 *tp,
1710+
struct sockaddr_storage *ss)
17101711
{
17111712
acpi_status status;
17121713
struct acpi_buffer buffer = { ACPI_ALLOCATE_BUFFER, NULL };
@@ -1774,47 +1775,48 @@ static int vendor_mac_passthru_addr_read(struct r8152 *tp, struct sockaddr *sa)
17741775
ret = -EINVAL;
17751776
goto amacout;
17761777
}
1777-
memcpy(sa->sa_data, buf, 6);
1778+
memcpy(ss->__data, buf, 6);
17781779
tp->netdev->addr_assign_type = NET_ADDR_STOLEN;
17791780
netif_info(tp, probe, tp->netdev,
1780-
"Using pass-thru MAC addr %pM\n", sa->sa_data);
1781+
"Using pass-thru MAC addr %pM\n", ss->__data);
17811782

17821783
amacout:
17831784
kfree(obj);
17841785
return ret;
17851786
}
17861787

1787-
static int determine_ethernet_addr(struct r8152 *tp, struct sockaddr *sa)
1788+
static int determine_ethernet_addr(struct r8152 *tp,
1789+
struct sockaddr_storage *ss)
17881790
{
17891791
struct net_device *dev = tp->netdev;
17901792
int ret;
17911793

1792-
sa->sa_family = dev->type;
1794+
ss->ss_family = dev->type;
17931795

1794-
ret = eth_platform_get_mac_address(&tp->udev->dev, sa->sa_data);
1796+
ret = eth_platform_get_mac_address(&tp->udev->dev, ss->__data);
17951797
if (ret < 0) {
17961798
if (tp->version == RTL_VER_01) {
1797-
ret = pla_ocp_read(tp, PLA_IDR, 8, sa->sa_data);
1799+
ret = pla_ocp_read(tp, PLA_IDR, 8, ss->__data);
17981800
} else {
17991801
/* if device doesn't support MAC pass through this will
18001802
* be expected to be non-zero
18011803
*/
1802-
ret = vendor_mac_passthru_addr_read(tp, sa);
1804+
ret = vendor_mac_passthru_addr_read(tp, ss);
18031805
if (ret < 0)
18041806
ret = pla_ocp_read(tp, PLA_BACKUP, 8,
1805-
sa->sa_data);
1807+
ss->__data);
18061808
}
18071809
}
18081810

18091811
if (ret < 0) {
18101812
netif_err(tp, probe, dev, "Get ether addr fail\n");
1811-
} else if (!is_valid_ether_addr(sa->sa_data)) {
1813+
} else if (!is_valid_ether_addr(ss->__data)) {
18121814
netif_err(tp, probe, dev, "Invalid ether addr %pM\n",
1813-
sa->sa_data);
1815+
ss->__data);
18141816
eth_hw_addr_random(dev);
1815-
ether_addr_copy(sa->sa_data, dev->dev_addr);
1817+
ether_addr_copy(ss->__data, dev->dev_addr);
18161818
netif_info(tp, probe, dev, "Random ether addr %pM\n",
1817-
sa->sa_data);
1819+
ss->__data);
18181820
return 0;
18191821
}
18201822

@@ -1824,17 +1826,17 @@ static int determine_ethernet_addr(struct r8152 *tp, struct sockaddr *sa)
18241826
static int set_ethernet_addr(struct r8152 *tp, bool in_resume)
18251827
{
18261828
struct net_device *dev = tp->netdev;
1827-
struct sockaddr sa;
1829+
struct sockaddr_storage ss;
18281830
int ret;
18291831

1830-
ret = determine_ethernet_addr(tp, &sa);
1832+
ret = determine_ethernet_addr(tp, &ss);
18311833
if (ret < 0)
18321834
return ret;
18331835

18341836
if (tp->version == RTL_VER_01)
1835-
eth_hw_addr_set(dev, sa.sa_data);
1837+
eth_hw_addr_set(dev, ss.__data);
18361838
else
1837-
ret = __rtl8152_set_mac_address(dev, &sa, in_resume);
1839+
ret = __rtl8152_set_mac_address(dev, &ss, in_resume);
18381840

18391841
return ret;
18401842
}
@@ -8421,16 +8423,16 @@ static int rtl8152_post_reset(struct usb_interface *intf)
84218423
{
84228424
struct r8152 *tp = usb_get_intfdata(intf);
84238425
struct net_device *netdev;
8424-
struct sockaddr sa;
8426+
struct sockaddr_storage ss;
84258427

84268428
if (!tp || !test_bit(PROBED_WITH_NO_ERRORS, &tp->flags))
84278429
goto exit;
84288430

84298431
rtl_set_accessible(tp);
84308432

84318433
/* reset the MAC address in case of policy change */
8432-
if (determine_ethernet_addr(tp, &sa) >= 0)
8433-
dev_set_mac_address (tp->netdev, &sa, NULL);
8434+
if (determine_ethernet_addr(tp, &ss) >= 0)
8435+
dev_set_mac_address(tp->netdev, &ss, NULL);
84348436

84358437
netdev = tp->netdev;
84368438
if (!netif_running(netdev))

drivers/nvme/target/rdma.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1999,7 +1999,7 @@ static void nvmet_rdma_disc_port_addr(struct nvmet_req *req,
19991999
struct nvmet_rdma_port *port = nport->priv;
20002000
struct rdma_cm_id *cm_id = port->cm_id;
20012001

2002-
if (inet_addr_is_any((struct sockaddr *)&cm_id->route.addr.src_addr)) {
2002+
if (inet_addr_is_any(&cm_id->route.addr.src_addr)) {
20032003
struct nvmet_rdma_rsp *rsp =
20042004
container_of(req, struct nvmet_rdma_rsp, req);
20052005
struct rdma_cm_id *req_cm_id = rsp->queue->cm_id;

drivers/nvme/target/tcp.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2194,7 +2194,7 @@ static void nvmet_tcp_disc_port_addr(struct nvmet_req *req,
21942194
{
21952195
struct nvmet_tcp_port *port = nport->priv;
21962196

2197-
if (inet_addr_is_any((struct sockaddr *)&port->addr)) {
2197+
if (inet_addr_is_any(&port->addr)) {
21982198
struct nvmet_tcp_cmd *cmd =
21992199
container_of(req, struct nvmet_tcp_cmd, req);
22002200
struct nvmet_tcp_queue *queue = cmd->queue;

0 commit comments

Comments
 (0)