mirror of
https://github.com/torvalds/linux.git
synced 2026-07-28 01:55:51 +02:00
ieee802154: Restore initial state on failed device_rename() in cfg802154_switch_netns()
Currently, the return value of device_rename() is not acted upon.
To avoid an inconsistent state in case of failure, roll back the changes
made before the device_rename() call.
Found by Linux Verification Center (linuxtesting.org) with Syzkaller.
Fixes: 66e5c2672c ("ieee802154: add netns support")
Reviewed-by: Miquel Raynal <miquel.raynal@bootlin.com>
Signed-off-by: Ivan Abramov <i.abramov@mt-integration.ru>
Link: https://lore.kernel.org/20250403101935.991385-2-i.abramov@mt-integration.ru
Signed-off-by: Stefan Schmidt <stefan@datenfreihafen.org>
This commit is contained in:
parent
b85966adbf
commit
a2e06b4bef
|
|
@ -233,31 +233,36 @@ int cfg802154_switch_netns(struct cfg802154_registered_device *rdev,
|
|||
wpan_dev->netdev->netns_immutable = true;
|
||||
}
|
||||
|
||||
if (err) {
|
||||
/* failed -- clean up to old netns */
|
||||
net = wpan_phy_net(&rdev->wpan_phy);
|
||||
|
||||
list_for_each_entry_continue_reverse(wpan_dev,
|
||||
&rdev->wpan_dev_list,
|
||||
list) {
|
||||
if (!wpan_dev->netdev)
|
||||
continue;
|
||||
wpan_dev->netdev->netns_immutable = false;
|
||||
err = dev_change_net_namespace(wpan_dev->netdev, net,
|
||||
"wpan%d");
|
||||
WARN_ON(err);
|
||||
wpan_dev->netdev->netns_immutable = true;
|
||||
}
|
||||
|
||||
return err;
|
||||
}
|
||||
|
||||
wpan_phy_net_set(&rdev->wpan_phy, net);
|
||||
if (err)
|
||||
goto errout;
|
||||
|
||||
err = device_rename(&rdev->wpan_phy.dev, dev_name(&rdev->wpan_phy.dev));
|
||||
WARN_ON(err);
|
||||
|
||||
if (err)
|
||||
goto errout;
|
||||
|
||||
wpan_phy_net_set(&rdev->wpan_phy, net);
|
||||
|
||||
return 0;
|
||||
|
||||
errout:
|
||||
/* failed -- clean up to old netns */
|
||||
net = wpan_phy_net(&rdev->wpan_phy);
|
||||
|
||||
list_for_each_entry_continue_reverse(wpan_dev,
|
||||
&rdev->wpan_dev_list,
|
||||
list) {
|
||||
if (!wpan_dev->netdev)
|
||||
continue;
|
||||
wpan_dev->netdev->netns_immutable = false;
|
||||
err = dev_change_net_namespace(wpan_dev->netdev, net,
|
||||
"wpan%d");
|
||||
WARN_ON(err);
|
||||
wpan_dev->netdev->netns_immutable = true;
|
||||
}
|
||||
|
||||
return err;
|
||||
}
|
||||
|
||||
void cfg802154_dev_free(struct cfg802154_registered_device *rdev)
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user