patch-2.4.26 linux-2.4.26/net/bluetooth/hci_conn.c
Next file: linux-2.4.26/net/bluetooth/hci_core.c
Previous file: linux-2.4.26/net/bluetooth/cmtp/sock.c
Back to the patch index
Back to the overall index
- Lines: 76
- Date:
2004-04-14 06:05:41.000000000 -0700
- Orig file:
linux-2.4.25/net/bluetooth/hci_conn.c
- Orig date:
2004-02-18 05:36:32.000000000 -0800
diff -urN linux-2.4.25/net/bluetooth/hci_conn.c linux-2.4.26/net/bluetooth/hci_conn.c
@@ -358,21 +358,24 @@
struct hci_conn_info *ci;
struct hci_dev *hdev;
struct list_head *p;
- int n = 0, size;
+ int n = 0, size, err;
if (copy_from_user(&req, (void *) arg, sizeof(req)))
return -EFAULT;
- if (!(hdev = hci_dev_get(req.dev_id)))
- return -ENODEV;
-
- size = req.conn_num * sizeof(struct hci_conn_info) + sizeof(req);
+ if (!req.conn_num || req.conn_num > (PAGE_SIZE * 2) / sizeof(*ci))
+ return -EINVAL;
- if (verify_area(VERIFY_WRITE, (void *)arg, size))
- return -EFAULT;
+ size = sizeof(req) + req.conn_num * sizeof(*ci);
if (!(cl = (void *) kmalloc(size, GFP_KERNEL)))
return -ENOMEM;
+
+ if (!(hdev = hci_dev_get(req.dev_id))) {
+ kfree(cl);
+ return -ENODEV;
+ }
+
ci = cl->conn_info;
hci_dev_lock_bh(hdev);
@@ -386,20 +389,21 @@
(ci + n)->out = c->out;
(ci + n)->state = c->state;
(ci + n)->link_mode = c->link_mode;
- n++;
+ if (++n >= req.conn_num)
+ break;
}
hci_dev_unlock_bh(hdev);
cl->dev_id = hdev->id;
cl->conn_num = n;
- size = n * sizeof(struct hci_conn_info) + sizeof(req);
+ size = sizeof(req) + n * sizeof(*ci);
hci_dev_put(hdev);
- copy_to_user((void *) arg, cl, size);
+ err = copy_to_user((void *) arg, cl, size);
kfree(cl);
- return 0;
+ return err ? -EFAULT : 0;
}
int hci_get_conn_info(struct hci_dev *hdev, unsigned long arg)
@@ -412,9 +416,6 @@
if (copy_from_user(&req, (void *) arg, sizeof(req)))
return -EFAULT;
- if (verify_area(VERIFY_WRITE, ptr, sizeof(ci)))
- return -EFAULT;
-
hci_dev_lock_bh(hdev);
conn = conn_hash_lookup_ba(hdev, req.type, &req.bdaddr);
if (conn) {
@@ -430,6 +431,5 @@
if (!conn)
return -ENOENT;
- copy_to_user(ptr, &ci, sizeof(ci));
- return 0;
+ return copy_to_user(ptr, &ci, sizeof(ci)) ? -EFAULT : 0;
}
FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen (who was at: slshen@lbl.gov)