2012-02-24 16:01:49

by Danny Kukawka

[permalink] [raw]
Subject: [PATCH 00/12] Part 2: check given MAC address, if invalid return -EADDRNOTAVAIL

Second Part of series patches to unifiy the return value of
.ndo_set_mac_address if the given address isn't valid.

These changes check if a given (MAC) address is valid in
.ndo_set_mac_address, if invalid return -EADDRNOTAVAIL
as eth_mac_addr() already does if is_valid_ether_addr() fails.

These patches are against net-next.

Danny Kukawka (12):
ethernet: .ndo_set_mac_address: check given address, if invalid
return -EADDRNOTAVAIL
cris/eth_v10: check given MAC address, if invalid return
-EADDRNOTAVAIL
dvb_net: check given MAC address, if invalid return -EADDRNOTAVAIL
fddi/skfp: check given MAC address, if invalid return -EADDRNOTAVAIL
team: check given MAC address, if invalid return -EADDRNOTAVAIL
tokenring: check given MAC address, if invalid return -EADDRNOTAVAIL
usb/rtl8150: check given MAC address, if invalid return
-EADDRNOTAVAIL
vmxnet3: check given MAC address, if invalid return -EADDRNOTAVAIL
wan/lapbether: check given MAC address, if invalid return
-EADDRNOTAVAIL
wireless: check given MAC address, if invalid return -EADDRNOTAVAIL
s390/net/qeth_l2_main: check given MAC address, if invalid return
-EADDRNOTAVAIL
rose: check given MAC address, if invalid return -EADDRNOTAVAIL

drivers/media/dvb/dvb-core/dvb_net.c | 5 ++++-
drivers/net/cris/eth_v10.c | 3 +++
drivers/net/ethernet/amd/amd8111e.c | 3 +++
drivers/net/ethernet/amd/atarilance.c | 3 +++
drivers/net/ethernet/chelsio/cxgb/cxgb2.c | 3 +++
drivers/net/ethernet/cisco/enic/enic_main.c | 3 +++
drivers/net/ethernet/freescale/fec_mpc52xx.c | 3 +++
drivers/net/ethernet/jme.c | 3 +++
drivers/net/ethernet/micrel/ks8851_mll.c | 3 +++
drivers/net/ethernet/micrel/ksz884x.c | 3 +++
drivers/net/ethernet/seeq/sgiseeq.c | 3 +++
drivers/net/ethernet/sgi/ioc3-eth.c | 3 +++
drivers/net/ethernet/tehuti/tehuti.c | 3 +++
drivers/net/fddi/skfp/skfddi.c | 3 +++
drivers/net/team/team.c | 3 +++
drivers/net/tokenring/3c359.c | 4 ++++
drivers/net/tokenring/lanstreamer.c | 4 ++++
drivers/net/tokenring/olympic.c | 4 ++++
drivers/net/tokenring/tms380tr.c | 3 +++
drivers/net/usb/rtl8150.c | 3 +++
drivers/net/vmxnet3/vmxnet3_drv.c | 3 +++
drivers/net/wan/lapbether.c | 5 +++++
drivers/net/wireless/airo.c | 3 +++
drivers/net/wireless/atmel.c | 3 +++
.../net/wireless/brcm80211/brcmfmac/dhd_linux.c | 5 ++++-
drivers/net/wireless/hostap/hostap_main.c | 3 +++
drivers/net/wireless/libertas/main.c | 3 +++
drivers/net/wireless/mwifiex/main.c | 3 +++
drivers/net/wireless/zd1201.c | 2 ++
drivers/s390/net/qeth_l2_main.c | 3 +++
net/rose/rose_dev.c | 3 +++
31 files changed, 99 insertions(+), 2 deletions(-)

--
1.7.8.3



2012-02-24 16:04:02

by Danny Kukawka

[permalink] [raw]
Subject: [PATCH 10/12] wireless: check given MAC address, if invalid return -EADDRNOTAVAIL

Check if given address is valid in .ndo_set_mac_address, if
invalid return -EADDRNOTAVAIL as eth_mac_addr() already does
if is_valid_ether_addr() fails.

Signed-off-by: Danny Kukawka <[email protected]>
---
drivers/net/wireless/airo.c | 3 +++
drivers/net/wireless/atmel.c | 3 +++
.../net/wireless/brcm80211/brcmfmac/dhd_linux.c | 5 ++++-
drivers/net/wireless/hostap/hostap_main.c | 3 +++
drivers/net/wireless/libertas/main.c | 3 +++
drivers/net/wireless/mwifiex/main.c | 3 +++
drivers/net/wireless/zd1201.c | 2 ++
7 files changed, 21 insertions(+), 1 deletions(-)

diff --git a/drivers/net/wireless/airo.c b/drivers/net/wireless/airo.c
index 1c008c6..a205332 100644
--- a/drivers/net/wireless/airo.c
+++ b/drivers/net/wireless/airo.c
@@ -2320,6 +2320,9 @@ static int airo_set_mac_address(struct net_device *dev, void *p)
struct airo_info *ai = dev->ml_priv;
struct sockaddr *addr = p;

+ if (!is_valid_ether_addr(addr->sa_data))
+ return -EADDRNOTAVAIL;
+
readConfigRid(ai, 1);
memcpy (ai->config.macAddr, addr->sa_data, dev->addr_len);
set_bit (FLAG_COMMIT, &ai->flags);
diff --git a/drivers/net/wireless/atmel.c b/drivers/net/wireless/atmel.c
index 3010cee..1abeb0e 100644
--- a/drivers/net/wireless/atmel.c
+++ b/drivers/net/wireless/atmel.c
@@ -1309,6 +1309,9 @@ static int atmel_set_mac_address(struct net_device *dev, void *p)
{
struct sockaddr *addr = p;

+ if (!is_valid_ether_addr(addr->sa_data))
+ return -EADDRNOTAVAIL;
+
memcpy (dev->dev_addr, addr->sa_data, dev->addr_len);
return atmel_open(dev);
}
diff --git a/drivers/net/wireless/brcm80211/brcmfmac/dhd_linux.c b/drivers/net/wireless/brcm80211/brcmfmac/dhd_linux.c
index db2df1f..d192758 100644
--- a/drivers/net/wireless/brcm80211/brcmfmac/dhd_linux.c
+++ b/drivers/net/wireless/brcm80211/brcmfmac/dhd_linux.c
@@ -257,7 +257,10 @@ static int brcmf_netdev_set_mac_address(struct net_device *ndev, void *addr)
{
struct brcmf_if *ifp = netdev_priv(ndev);
struct brcmf_pub *drvr = ifp->drvr;
- struct sockaddr *sa = (struct sockaddr *)addr;
+ struct sockaddr *sa = addr;
+
+ if (!is_valid_ether_addr(sa->sa_data))
+ return -EADDRNOTAVAIL;

memcpy(&drvr->macvalue, sa->sa_data, ETH_ALEN);
schedule_work(&drvr->setmacaddr_work);
diff --git a/drivers/net/wireless/hostap/hostap_main.c b/drivers/net/wireless/hostap/hostap_main.c
index bfa0d54..0c475d3 100644
--- a/drivers/net/wireless/hostap/hostap_main.c
+++ b/drivers/net/wireless/hostap/hostap_main.c
@@ -713,6 +713,9 @@ static int prism2_set_mac_address(struct net_device *dev, void *p)
iface = netdev_priv(dev);
local = iface->local;

+ if (!is_valid_ether_addr(addr->sa_data))
+ return -EADDRNOTAVAIL;
+
if (local->func->set_rid(dev, HFA384X_RID_CNFOWNMACADDR, addr->sa_data,
ETH_ALEN) < 0 || local->func->reset_port(dev))
return -EINVAL;
diff --git a/drivers/net/wireless/libertas/main.c b/drivers/net/wireless/libertas/main.c
index 957681d..33bf268 100644
--- a/drivers/net/wireless/libertas/main.c
+++ b/drivers/net/wireless/libertas/main.c
@@ -297,6 +297,9 @@ int lbs_set_mac_address(struct net_device *dev, void *addr)

lbs_deb_enter(LBS_DEB_NET);

+ if (!is_valid_ether_addr(phwaddr->sa_data))
+ return -EADDRNOTAVAIL;
+
/*
* Can only set MAC address when all interfaces are down, to be written
* to the hardware when one of them is brought up.
diff --git a/drivers/net/wireless/mwifiex/main.c b/drivers/net/wireless/mwifiex/main.c
index 790a379..7b43109 100644
--- a/drivers/net/wireless/mwifiex/main.c
+++ b/drivers/net/wireless/mwifiex/main.c
@@ -485,6 +485,9 @@ mwifiex_set_mac_address(struct net_device *dev, void *addr)
struct sockaddr *hw_addr = addr;
int ret;

+ if (!is_valid_ether_addr(hw_addr->sa_data))
+ return -EADDRNOTAVAIL;
+
memcpy(priv->curr_addr, hw_addr->sa_data, ETH_ALEN);

/* Send request to firmware */
diff --git a/drivers/net/wireless/zd1201.c b/drivers/net/wireless/zd1201.c
index a66b93b..60bc0ea 100644
--- a/drivers/net/wireless/zd1201.c
+++ b/drivers/net/wireless/zd1201.c
@@ -853,6 +853,8 @@ static int zd1201_set_mac_address(struct net_device *dev, void *p)

if (!zd)
return -ENODEV;
+ if (!is_valid_ether_addr(addr->sa_data))
+ return -EADDRNOTAVAIL;

err = zd1201_setconfig(zd, ZD1201_RID_CNFOWNMACADDR,
addr->sa_data, dev->addr_len, 1);
--
1.7.8.3


2012-02-29 07:04:19

by Danny Kukawka

[permalink] [raw]
Subject: Re: [PATCH 00/12] Part 2: check given MAC address, if invalid return -EADDRNOTAVAIL

On Samstag, 25. Februar 2012, Geert Uytterhoeven wrote:
> 2012/2/24 Michał Mirosław <[email protected]>:
> > 2012/2/24 Danny Kukawka <[email protected]>:
> >> Second Part of series patches to unifiy the return value of
> >> .ndo_set_mac_address if the given address isn't valid.
> >>
> >> These changes check if a given (MAC) address is valid in
> >> .ndo_set_mac_address, if invalid return -EADDRNOTAVAIL
> >> as eth_mac_addr() already does if is_valid_ether_addr() fails.
> >
> > Why not just fix dev_set_mac_address() and make do_setlink() use that?
>
> BTW, it's also called from dev_set_mac_address().
>
> > Checks are specific to address family, not device model I assume.
>
> Indeed, why can't this be done in one single place, instead of sprinkling
> these checks over all drivers, missing all out-of-tree (note: I don't care)
> and all soon-to-be-submitted drivers?

Since the .ndo_set_mac_address functions are used by some drivers internally
too, you may get some new checks on other places. But I'll take a look at it.

Danny


2012-02-24 17:59:25

by Michał Mirosław

[permalink] [raw]
Subject: Re: [PATCH 00/12] Part 2: check given MAC address, if invalid return -EADDRNOTAVAIL

2012/2/24 Danny Kukawka <[email protected]>:
> Second Part of series patches to unifiy the return value of
> .ndo_set_mac_address if the given address isn't valid.
>
> These changes check if a given (MAC) address is valid in
> .ndo_set_mac_address, if invalid return -EADDRNOTAVAIL
> as eth_mac_addr() already does if is_valid_ether_addr() fails.

Why not just fix dev_set_mac_address() and make do_setlink() use that?
Checks are specific to address family, not device model I assume.

Best Regards,
Michał Mirosław

2012-02-25 10:13:23

by Geert Uytterhoeven

[permalink] [raw]
Subject: Re: [PATCH 00/12] Part 2: check given MAC address, if invalid return -EADDRNOTAVAIL

2012/2/24 Michał Mirosław <[email protected]>:
> 2012/2/24 Danny Kukawka <[email protected]>:
>> Second Part of series patches to unifiy the return value of
>> .ndo_set_mac_address if the given address isn't valid.
>>
>> These changes check if a given (MAC) address is valid in
>> .ndo_set_mac_address, if invalid return -EADDRNOTAVAIL
>> as eth_mac_addr() already does if is_valid_ether_addr() fails.
>
> Why not just fix dev_set_mac_address() and make do_setlink() use that?

BTW, it's also called from dev_set_mac_address().

> Checks are specific to address family, not device model I assume.

Indeed, why can't this be done in one single place, instead of sprinkling these
checks over all drivers, missing all out-of-tree (note: I don't care) and all
soon-to-be-submitted drivers?

Gr{oetje,eeting}s,

                        Geert

--
Geert Uytterhoeven -- There's lots of Linux beyond ia32 -- [email protected]

In personal conversations with technical people, I call myself a hacker. But
when I'm talking to journalists I just say "programmer" or something like that.
                                -- Linus Torvalds