Skip to content

Commit

Permalink
mt76: do not use devm API for led classdev
Browse files Browse the repository at this point in the history
With the devm API, the unregister happens after the device cleanup is done,
after which the struct mt76_dev which contains the led_cdev has already been
freed. This leads to a use-after-free bug that can crash the system.

Signed-off-by: Felix Fietkau <nbd@nbd.name>
  • Loading branch information
Felix Fietkau committed Nov 20, 2019
1 parent 55857ab commit 36f7e2b
Showing 1 changed file with 10 additions and 1 deletion.
11 changes: 10 additions & 1 deletion drivers/net/wireless/mediatek/mt76/mac80211.c
Original file line number Diff line number Diff line change
Expand Up @@ -105,7 +105,15 @@ static int mt76_led_init(struct mt76_dev *dev)
dev->led_al = of_property_read_bool(np, "led-active-low");
}

return devm_led_classdev_register(dev->dev, &dev->led_cdev);
return led_classdev_register(dev->dev, &dev->led_cdev);
}

static void mt76_led_cleanup(struct mt76_dev *dev)
{
if (!dev->led_cdev.brightness_set && !dev->led_cdev.blink_set)
return;

led_classdev_unregister(&dev->led_cdev);
}

static void mt76_init_stream_cap(struct mt76_dev *dev,
Expand Down Expand Up @@ -362,6 +370,7 @@ void mt76_unregister_device(struct mt76_dev *dev)
{
struct ieee80211_hw *hw = dev->hw;

mt76_led_cleanup(dev);
mt76_tx_status_check(dev, NULL, true);
ieee80211_unregister_hw(hw);
}
Expand Down

0 comments on commit 36f7e2b

Please sign in to comment.