Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 255843
b: refs/heads/master
c: b2a66aa
h: refs/heads/master
i:
  255841: 6750870
  255839: 54cdac6
v: v3
  • Loading branch information
Antti Julku authored and Gustavo F. Padovan committed Jun 16, 2011
1 parent c45fe82 commit 48fd0a3
Show file tree
Hide file tree
Showing 4 changed files with 88 additions and 65 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 3158c50c33c1acddcfa3c57fab812435aa459750
refs/heads/master: b2a66aad8620337e38d6692f03d94a03d5129840
2 changes: 2 additions & 0 deletions trunk/include/net/bluetooth/hci_core.h
Original file line number Diff line number Diff line change
Expand Up @@ -529,6 +529,8 @@ int hci_inquiry(void __user *arg);

struct bdaddr_list *hci_blacklist_lookup(struct hci_dev *hdev, bdaddr_t *bdaddr);
int hci_blacklist_clear(struct hci_dev *hdev);
int hci_blacklist_add(struct hci_dev *hdev, bdaddr_t *bdaddr);
int hci_blacklist_del(struct hci_dev *hdev, bdaddr_t *bdaddr);

int hci_uuids_clear(struct hci_dev *hdev);

Expand Down
79 changes: 79 additions & 0 deletions trunk/net/bluetooth/hci_core.c
Original file line number Diff line number Diff line change
Expand Up @@ -1205,6 +1205,85 @@ 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 list_head *p;

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

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

if (bacmp(bdaddr, &b->bdaddr) == 0)
return b;
}

return NULL;
}

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);

list_del(p);
kfree(b);
}

return 0;
}

int hci_blacklist_add(struct hci_dev *hdev, bdaddr_t *bdaddr)
{
struct bdaddr_list *entry;

hci_dev_lock(hdev);

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

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

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

bacpy(&entry->bdaddr, bdaddr);

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

hci_dev_unlock(hdev);

return 0;
}

int hci_blacklist_del(struct hci_dev *hdev, bdaddr_t *bdaddr)
{
struct bdaddr_list *entry;

hci_dev_lock(hdev);

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

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

list_del(&entry->list);
kfree(entry);

hci_dev_unlock(hdev);

return 0;
}

static void hci_clear_adv_cache(unsigned long arg)
{
struct hci_dev *hdev = (void *) arg;
Expand Down
70 changes: 6 additions & 64 deletions trunk/net/bluetooth/hci_sock.c
Original file line number Diff line number Diff line change
Expand Up @@ -180,82 +180,24 @@ static int hci_sock_release(struct socket *sock)
return 0;
}

struct bdaddr_list *hci_blacklist_lookup(struct hci_dev *hdev, bdaddr_t *bdaddr)
{
struct list_head *p;

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

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

if (bacmp(bdaddr, &b->bdaddr) == 0)
return b;
}

return NULL;
}

static int hci_blacklist_add(struct hci_dev *hdev, void __user *arg)
static int hci_sock_blacklist_add(struct hci_dev *hdev, void __user *arg)
{
bdaddr_t bdaddr;
struct bdaddr_list *entry;

if (copy_from_user(&bdaddr, arg, sizeof(bdaddr)))
return -EFAULT;

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

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

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

bacpy(&entry->bdaddr, &bdaddr);

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

return 0;
}

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);

list_del(p);
kfree(b);
}

return 0;
return hci_blacklist_add(hdev, &bdaddr);
}

static int hci_blacklist_del(struct hci_dev *hdev, void __user *arg)
static int hci_sock_blacklist_del(struct hci_dev *hdev, void __user *arg)
{
bdaddr_t bdaddr;
struct bdaddr_list *entry;

if (copy_from_user(&bdaddr, arg, sizeof(bdaddr)))
return -EFAULT;

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

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

list_del(&entry->list);
kfree(entry);

return 0;
return hci_blacklist_del(hdev, &bdaddr);
}

/* Ioctls that require bound socket */
Expand Down Expand Up @@ -290,12 +232,12 @@ static inline int hci_sock_bound_ioctl(struct sock *sk, unsigned int cmd, unsign
case HCIBLOCKADDR:
if (!capable(CAP_NET_ADMIN))
return -EACCES;
return hci_blacklist_add(hdev, (void __user *) arg);
return hci_sock_blacklist_add(hdev, (void __user *) arg);

case HCIUNBLOCKADDR:
if (!capable(CAP_NET_ADMIN))
return -EACCES;
return hci_blacklist_del(hdev, (void __user *) arg);
return hci_sock_blacklist_del(hdev, (void __user *) arg);

default:
if (hdev->ioctl)
Expand Down

0 comments on commit 48fd0a3

Please sign in to comment.