Bluetooth: 6lowpan: Fix possible race
This patch fix a possible race after calling register_netdev. After calling netdev_register it could be possible that netdev_ops callbacks use the uninitialized private data of lowpan_dev. By moving the initialization of this data before netdev_register we can be sure that initialized private data is be used after netdev_register. Signed-off-by: Alexander Aring <alex.aring@gmail.com> Signed-off-by: Marcel Holtmann <marcel@holtmann.org>
This commit is contained in:
parent
c22ff7b4e7
commit
5857d1dbae
1 changed files with 15 additions and 12 deletions
|
@ -859,18 +859,6 @@ static int setup_netdev(struct l2cap_chan *chan, struct lowpan_dev **dev)
|
||||||
SET_NETDEV_DEV(netdev, &chan->conn->hcon->hdev->dev);
|
SET_NETDEV_DEV(netdev, &chan->conn->hcon->hdev->dev);
|
||||||
SET_NETDEV_DEVTYPE(netdev, &bt_type);
|
SET_NETDEV_DEVTYPE(netdev, &bt_type);
|
||||||
|
|
||||||
err = register_netdev(netdev);
|
|
||||||
if (err < 0) {
|
|
||||||
BT_INFO("register_netdev failed %d", err);
|
|
||||||
free_netdev(netdev);
|
|
||||||
goto out;
|
|
||||||
}
|
|
||||||
|
|
||||||
BT_DBG("ifindex %d peer bdaddr %pMR type %d my addr %pMR type %d",
|
|
||||||
netdev->ifindex, &chan->dst, chan->dst_type,
|
|
||||||
&chan->src, chan->src_type);
|
|
||||||
set_bit(__LINK_STATE_PRESENT, &netdev->state);
|
|
||||||
|
|
||||||
*dev = netdev_priv(netdev);
|
*dev = netdev_priv(netdev);
|
||||||
(*dev)->netdev = netdev;
|
(*dev)->netdev = netdev;
|
||||||
(*dev)->hdev = chan->conn->hcon->hdev;
|
(*dev)->hdev = chan->conn->hcon->hdev;
|
||||||
|
@ -881,6 +869,21 @@ static int setup_netdev(struct l2cap_chan *chan, struct lowpan_dev **dev)
|
||||||
list_add_rcu(&(*dev)->list, &bt_6lowpan_devices);
|
list_add_rcu(&(*dev)->list, &bt_6lowpan_devices);
|
||||||
spin_unlock(&devices_lock);
|
spin_unlock(&devices_lock);
|
||||||
|
|
||||||
|
err = register_netdev(netdev);
|
||||||
|
if (err < 0) {
|
||||||
|
BT_INFO("register_netdev failed %d", err);
|
||||||
|
spin_lock(&devices_lock);
|
||||||
|
list_del_rcu(&(*dev)->list);
|
||||||
|
spin_unlock(&devices_lock);
|
||||||
|
free_netdev(netdev);
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
|
BT_DBG("ifindex %d peer bdaddr %pMR type %d my addr %pMR type %d",
|
||||||
|
netdev->ifindex, &chan->dst, chan->dst_type,
|
||||||
|
&chan->src, chan->src_type);
|
||||||
|
set_bit(__LINK_STATE_PRESENT, &netdev->state);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
out:
|
out:
|
||||||
|
|
Loading…
Add table
Reference in a new issue