|
@@ -189,13 +189,13 @@ static inline ssize_t vhci_get_user(struct vhci_data *data,
|
|
break;
|
|
break;
|
|
|
|
|
|
case HCI_VENDOR_PKT:
|
|
case HCI_VENDOR_PKT:
|
|
|
|
+ cancel_delayed_work_sync(&data->open_timeout);
|
|
|
|
+
|
|
if (data->hdev) {
|
|
if (data->hdev) {
|
|
kfree_skb(skb);
|
|
kfree_skb(skb);
|
|
return -EBADFD;
|
|
return -EBADFD;
|
|
}
|
|
}
|
|
|
|
|
|
- cancel_delayed_work_sync(&data->open_timeout);
|
|
|
|
-
|
|
|
|
opcode = *((__u8 *) skb->data);
|
|
opcode = *((__u8 *) skb->data);
|
|
skb_pull(skb, 1);
|
|
skb_pull(skb, 1);
|
|
|
|
|
|
@@ -333,10 +333,12 @@ static int vhci_open(struct inode *inode, struct file *file)
|
|
static int vhci_release(struct inode *inode, struct file *file)
|
|
static int vhci_release(struct inode *inode, struct file *file)
|
|
{
|
|
{
|
|
struct vhci_data *data = file->private_data;
|
|
struct vhci_data *data = file->private_data;
|
|
- struct hci_dev *hdev = data->hdev;
|
|
|
|
|
|
+ struct hci_dev *hdev;
|
|
|
|
|
|
cancel_delayed_work_sync(&data->open_timeout);
|
|
cancel_delayed_work_sync(&data->open_timeout);
|
|
|
|
|
|
|
|
+ hdev = data->hdev;
|
|
|
|
+
|
|
if (hdev) {
|
|
if (hdev) {
|
|
hci_unregister_dev(hdev);
|
|
hci_unregister_dev(hdev);
|
|
hci_free_dev(hdev);
|
|
hci_free_dev(hdev);
|