There was no unlock call on the errors path
Signed-off-by: Gustavo F. Padovan <padovan@profusion.mobi>
int hci_blacklist_add(struct hci_dev *hdev, bdaddr_t *bdaddr)
{
struct bdaddr_list *entry;
int hci_blacklist_add(struct hci_dev *hdev, bdaddr_t *bdaddr)
{
struct bdaddr_list *entry;
if (bacmp(bdaddr, BDADDR_ANY) == 0)
return -EBADF;
if (bacmp(bdaddr, BDADDR_ANY) == 0)
return -EBADF;
- if (hci_blacklist_lookup(hdev, bdaddr))
- return -EEXIST;
+ hci_dev_lock(hdev);
+
+ if (hci_blacklist_lookup(hdev, bdaddr)) {
+ err = -EEXIST;
+ goto err;
+ }
entry = kzalloc(sizeof(struct bdaddr_list), GFP_KERNEL);
entry = kzalloc(sizeof(struct bdaddr_list), GFP_KERNEL);
bacpy(&entry->bdaddr, bdaddr);
list_add(&entry->list, &hdev->blacklist);
bacpy(&entry->bdaddr, bdaddr);
list_add(&entry->list, &hdev->blacklist);
+err:
+ hci_dev_unlock(hdev);
+ return err;
}
int hci_blacklist_del(struct hci_dev *hdev, bdaddr_t *bdaddr)
{
struct bdaddr_list *entry;
}
int hci_blacklist_del(struct hci_dev *hdev, bdaddr_t *bdaddr)
{
struct bdaddr_list *entry;
- if (bacmp(bdaddr, BDADDR_ANY) == 0)
- return hci_blacklist_clear(hdev);
+ if (bacmp(bdaddr, BDADDR_ANY) == 0) {
+ hci_blacklist_clear(hdev);
+ goto done;
+ }
entry = hci_blacklist_lookup(hdev, bdaddr);
entry = hci_blacklist_lookup(hdev, bdaddr);
- if (!entry)
- return -ENOENT;
+ if (!entry) {
+ err = -ENOENT;
+ goto done;
+ }
list_del(&entry->list);
kfree(entry);
list_del(&entry->list);
kfree(entry);
}
static void hci_clear_adv_cache(unsigned long arg)
}
static void hci_clear_adv_cache(unsigned long arg)