Patch "Bluetooth: vhci: Fix race at creating hci device" has been added to the 4.5-stable tree
Subsystems (2)
This is a note to let you know that I've just added the patch titled
Bluetooth: vhci: Fix race at creating hci device
to the 4.5-stable tree which can be found at:
http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary
The filename of the patch is:
bluetooth-vhci-fix-race-at-creating-hci-device.patch
and it can be found in the queue-4.5 subdirectory.
If you, or anyone else, feels it should not be added to the stable tree, please let <[email protected]> know about it.
Quoted 1 line
From
c7c999cb18da88a881e10e07f0724ad0bfaff770Mon Sep 17 00:00:00 2001
From: Takashi Iwai <[email protected]>
Date: Thu, 14 Apr 2016 17:32:19 +0200
Subject: Bluetooth: vhci: Fix race at creating hci device
From: Takashi Iwai <[email protected]>
commit c7c999cb18da88a881e10e07f0724ad0bfaff770 upstream.
hci_vhci driver creates a hci device object dynamically upon each HCI_VENDOR_PKT write. Although it checks the already created object and returns an error, it's still racy and may build multiple hci_dev objects concurrently when parallel writes are performed, as the device tracks only a single hci_dev object.
This patch introduces a mutex to protect against the concurrent device creations.
--- drivers/bluetooth/hci_vhci.c | 23 +++++++++++++++++------ 1 file changed, 17 insertions(+), 6 deletions(-)
drivers/bluetooth/hci_vhci.c +17 -6
@@ -50,6 +50,7 @@ struct vhci_data {wait_queue_head_t read_wait;struct sk_buff_head readq; +struct mutex open_mutex;struct delayed_work open_timeout; };
@@ -87,12 +88,15 @@ static int vhci_send_frame(struct hci_dereturn 0 ; } -static int vhci_create_device (struct vhci_data *data,__u8 opcode) +static int __vhci_create_device (struct vhci_data *data,__u8 opcode) {struct hci_dev *hdev;struct sk_buff *skb;__u8 dev_type; +if (data->hdev) +return -EBADFD ; +/* bits 0-1 are dev_type (BR/EDR or AMP) */ dev_type = opcode &0x03 ;
@@ -151,6 +155,17 @@ static int vhci_create_device(struct vhcreturn 0 ; } +static int vhci_create_device (struct vhci_data *data,__u8 opcode) +{ +int err; + +mutex_lock (&data->open_mutex); + err =__vhci_create_device (data, opcode); +mutex_unlock (&data->open_mutex); + +return err; +} +static inline ssize_t vhci_get_user (struct vhci_data *data,struct iov_iter *from) {
@@ -191,11 +206,6 @@ static inline ssize_t vhci_get_user(strucase HCI_VENDOR_PKT :cancel_delayed_work_sync (&data->open_timeout); -if (data->hdev) { -kfree_skb (skb); -return -EBADFD ; - } - opcode = *((__u8 *) skb->data);skb_pull (skb,1 );
@@ -320,6 +330,7 @@ static int vhci_open(struct inode *inodeskb_queue_head_init (&data->readq);init_waitqueue_head (&data->read_wait); +mutex_init (&data->open_mutex);INIT_DELAYED_WORK (&data->open_timeout, vhci_open_timeout); file->private_data = data;
Patches currently in stable-queue which might be from [email protected] are
queue-4.5/bluetooth-vhci-fix-race-at-creating-hci-device.patch