mac802154: fix hold rtnl while ioctl
authorAlexander Aring <alex.aring@gmail.com>
Fri, 22 May 2015 15:43:51 +0000 (17:43 +0200)
committerMarcel Holtmann <marcel@holtmann.org>
Sat, 23 May 2015 15:57:07 +0000 (17:57 +0200)
This patch fixes an issue to set address configuration with ioctl.
Accessing the mib requires rtnl lock and the ndo_do_ioctl doesn't hold
the rtnl lock while this callback is called. This patch do that
manually.

Signed-off-by: Alexander Aring <alex.aring@gmail.com>
Reported-by: Matteo Petracca <matteo.petracca@sssup.it>
Reviewed-by: Stefan Schmidt <stefan@osg.samsung.com>
Signed-off-by: Marcel Holtmann <marcel@holtmann.org>
net/mac802154/iface.c

index 91b75ab..2a58788 100644 (file)
@@ -62,8 +62,7 @@ mac802154_wpan_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
                (struct sockaddr_ieee802154 *)&ifr->ifr_addr;
        int err = -ENOIOCTLCMD;
 
-       ASSERT_RTNL();
-
+       rtnl_lock();
        spin_lock_bh(&sdata->mib_lock);
 
        switch (cmd) {
@@ -90,6 +89,7 @@ mac802154_wpan_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
        case SIOCSIFADDR:
                if (netif_running(dev)) {
                        spin_unlock_bh(&sdata->mib_lock);
+                       rtnl_unlock();
                        return -EBUSY;
                }
 
@@ -112,6 +112,7 @@ mac802154_wpan_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
        }
 
        spin_unlock_bh(&sdata->mib_lock);
+       rtnl_unlock();
        return err;
 }