aboutsummaryrefslogtreecommitdiffstats
path: root/net/bluetooth
diff options
context:
space:
mode:
authorAndre Guedes <andre.guedes@openbossa.org>2013-03-08 09:20:16 -0500
committerGustavo Padovan <gustavo.padovan@collabora.co.uk>2013-03-09 15:10:47 -0500
commit5d73e0342fd9bf500583868906325d42c4d2bf6f (patch)
treebc438120341f687ff2cd9d6337f59459b1afd6a8 /net/bluetooth
parent920c8300c66566afbf92311152c6e462a310203e (diff)
Bluetooth: HCI request error handling
When we are building a HCI request with more than one HCI command and one of the hci_req_add calls fail, we should have some cleanup routine so the HCI commands already queued on HCI request can be deleted. Otherwise, we will face some memory leaks issues. This patch implements the HCI request error handling which is the following: If a hci_req_add fails, we save the error code in hci_ request. Once hci_req_run is called, we verify the error field. If it is different from zero, we delete all HCI commands already queued and return the error code. Signed-off-by: Andre Guedes <andre.guedes@openbossa.org> Acked-by: Johan Hedberg <johan.hedberg@intel.com> Signed-off-by: Gustavo Padovan <gustavo.padovan@collabora.co.uk>
Diffstat (limited to 'net/bluetooth')
-rw-r--r--net/bluetooth/hci_core.c13
1 files changed, 12 insertions, 1 deletions
diff --git a/net/bluetooth/hci_core.c b/net/bluetooth/hci_core.c
index 4603464b91e2..b432baafdf12 100644
--- a/net/bluetooth/hci_core.c
+++ b/net/bluetooth/hci_core.c
@@ -2443,6 +2443,7 @@ void hci_req_init(struct hci_request *req, struct hci_dev *hdev)
2443{ 2443{
2444 skb_queue_head_init(&req->cmd_q); 2444 skb_queue_head_init(&req->cmd_q);
2445 req->hdev = hdev; 2445 req->hdev = hdev;
2446 req->err = 0;
2446} 2447}
2447 2448
2448int hci_req_run(struct hci_request *req, hci_req_complete_t complete) 2449int hci_req_run(struct hci_request *req, hci_req_complete_t complete)
@@ -2453,6 +2454,14 @@ int hci_req_run(struct hci_request *req, hci_req_complete_t complete)
2453 2454
2454 BT_DBG("length %u", skb_queue_len(&req->cmd_q)); 2455 BT_DBG("length %u", skb_queue_len(&req->cmd_q));
2455 2456
2457 /* If an error occured during request building, remove all HCI
2458 * commands queued on the HCI request queue.
2459 */
2460 if (req->err) {
2461 skb_queue_purge(&req->cmd_q);
2462 return req->err;
2463 }
2464
2456 /* Do not allow empty requests */ 2465 /* Do not allow empty requests */
2457 if (skb_queue_empty(&req->cmd_q)) 2466 if (skb_queue_empty(&req->cmd_q))
2458 return -ENODATA; 2467 return -ENODATA;
@@ -2529,7 +2538,9 @@ int hci_req_add(struct hci_request *req, u16 opcode, u32 plen, void *param)
2529 2538
2530 skb = hci_prepare_cmd(hdev, opcode, plen, param); 2539 skb = hci_prepare_cmd(hdev, opcode, plen, param);
2531 if (!skb) { 2540 if (!skb) {
2532 BT_ERR("%s no memory for command", hdev->name); 2541 BT_ERR("%s no memory for command (opcode 0x%4.4x)",
2542 hdev->name, opcode);
2543 req->err = -ENOMEM;
2533 return -ENOMEM; 2544 return -ENOMEM;
2534 } 2545 }
2535 2546