Skip to content

Commit

Permalink
Bluetooth: Add address type to device blacklist table
Browse files Browse the repository at this point in the history
The device blacklist is not taking care of the address type. Actually
store the address type in the list entries and also use them when
looking up addresses in the table.

This is actually a serious bug. When adding a LE public address to
the blacklist, then it would be blocking a device on BR/EDR. And this
is not the expected behavior.

Signed-off-by: Marcel Holtmann <marcel@holtmann.org>
Signed-off-by: Johan Hedberg <johan.hedberg@intel.com>
  • Loading branch information
Marcel Holtmann authored and Johan Hedberg committed Oct 18, 2013
1 parent 041000b commit b9ee0a7
Show file tree
Hide file tree
Showing 3 changed files with 14 additions and 12 deletions.
3 changes: 2 additions & 1 deletion include/net/bluetooth/hci_core.h
Original file line number Diff line number Diff line change
Expand Up @@ -81,6 +81,7 @@ struct hci_conn_hash {
struct bdaddr_list {
struct list_head list;
bdaddr_t bdaddr;
u8 bdaddr_type;
};

struct bt_uuid {
Expand Down Expand Up @@ -732,7 +733,7 @@ int hci_get_auth_info(struct hci_dev *hdev, void __user *arg);
int hci_inquiry(void __user *arg);

struct bdaddr_list *hci_blacklist_lookup(struct hci_dev *hdev,
bdaddr_t *bdaddr);
bdaddr_t *bdaddr, u8 type);
int hci_blacklist_clear(struct hci_dev *hdev);
int hci_blacklist_add(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 type);
int hci_blacklist_del(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 type);
Expand Down
21 changes: 11 additions & 10 deletions net/bluetooth/hci_core.c
Original file line number Diff line number Diff line change
Expand Up @@ -2158,13 +2158,15 @@ int hci_add_remote_oob_data(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 *hash,
return 0;
}

struct bdaddr_list *hci_blacklist_lookup(struct hci_dev *hdev, bdaddr_t *bdaddr)
struct bdaddr_list *hci_blacklist_lookup(struct hci_dev *hdev,
bdaddr_t *bdaddr, u8 type)
{
struct bdaddr_list *b;

list_for_each_entry(b, &hdev->blacklist, list)
if (bacmp(bdaddr, &b->bdaddr) == 0)
list_for_each_entry(b, &hdev->blacklist, list) {
if (!bacmp(&b->bdaddr, bdaddr) && b->bdaddr_type == type)
return b;
}

return NULL;
}
Expand All @@ -2174,9 +2176,7 @@ int hci_blacklist_clear(struct hci_dev *hdev)
struct list_head *p, *n;

list_for_each_safe(p, n, &hdev->blacklist) {
struct bdaddr_list *b;

b = list_entry(p, struct bdaddr_list, list);
struct bdaddr_list *b = list_entry(p, struct bdaddr_list, list);

list_del(p);
kfree(b);
Expand All @@ -2189,17 +2189,18 @@ int hci_blacklist_add(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 type)
{
struct bdaddr_list *entry;

if (bacmp(bdaddr, BDADDR_ANY) == 0)
if (!bacmp(bdaddr, BDADDR_ANY))
return -EBADF;

if (hci_blacklist_lookup(hdev, bdaddr))
if (hci_blacklist_lookup(hdev, bdaddr, type))
return -EEXIST;

entry = kzalloc(sizeof(struct bdaddr_list), GFP_KERNEL);
if (!entry)
return -ENOMEM;

bacpy(&entry->bdaddr, bdaddr);
entry->bdaddr_type = type;

list_add(&entry->list, &hdev->blacklist);

Expand All @@ -2210,10 +2211,10 @@ int hci_blacklist_del(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 type)
{
struct bdaddr_list *entry;

if (bacmp(bdaddr, BDADDR_ANY) == 0)
if (!bacmp(bdaddr, BDADDR_ANY))
return hci_blacklist_clear(hdev);

entry = hci_blacklist_lookup(hdev, bdaddr);
entry = hci_blacklist_lookup(hdev, bdaddr, type);
if (!entry)
return -ENOENT;

Expand Down
2 changes: 1 addition & 1 deletion net/bluetooth/hci_event.c
Original file line number Diff line number Diff line change
Expand Up @@ -1692,7 +1692,7 @@ static void hci_conn_request_evt(struct hci_dev *hdev, struct sk_buff *skb)
&flags);

if ((mask & HCI_LM_ACCEPT) &&
!hci_blacklist_lookup(hdev, &ev->bdaddr)) {
!hci_blacklist_lookup(hdev, &ev->bdaddr, BDADDR_BREDR)) {
/* Connection accepted */
struct inquiry_entry *ie;
struct hci_conn *conn;
Expand Down

0 comments on commit b9ee0a7

Please sign in to comment.