diff options
| author | Dave Airlie <airlied@redhat.com> | 2014-01-20 10:21:54 +1000 | 
|---|---|---|
| committer | Dave Airlie <airlied@redhat.com> | 2014-01-20 10:21:54 +1000 | 
| commit | cfd72a4c2089aa3938f37281a34d6eb3306d5fd8 (patch) | |
| tree | e63f6df423aeb59d1ea5f7af3597d6718e75c335 /net/bluetooth/hci_sock.c | |
| parent | 9354eafd893f45320a37da360e1728104e49cc2f (diff) | |
| parent | 0d9d349d8788d30f3fc3bb39279c370f94d9dbec (diff) | |
Merge branch 'drm-intel-next' of git://people.freedesktop.org/~danvet/drm-intel into drm-next
drm-intel-next-2014-01-10:
- final bits for runtime D3 on Haswell from Paul (now enabled fully)
- parse the backlight modulation freq information in the VBT from Jani
  (but not yet used)
- more watermark improvements from Ville for ilk-ivb and bdw
- bugfixes for fastboot from Jesse
- watermark fix for i830M (but not yet everything)
- vlv vga hotplug w/a (Imre)
- piles of other small improvements, cleanups and fixes all over
Note that the pull request includes a backmerge of the last drm-fixes
pulled into Linus' tree - things where getting a bit too messy. So the
shortlog also contains a bunch of patches from Linus tree. Please yell if
you want me to frob it for you a bit.
* 'drm-intel-next' of git://people.freedesktop.org/~danvet/drm-intel: (609 commits)
  drm/i915/bdw: make sure south port interrupts are enabled properly v2
  drm/i915: Include more information in disabled hotplug interrupt warning
  drm/i915: Only complain about a rogue hotplug IRQ after disabling
  drm/i915: Only WARN about a stuck hotplug irq ONCE
  drm/i915: s/hotplugt_status_gen4/hotplug_status_g4x/
Diffstat (limited to 'net/bluetooth/hci_sock.c')
| -rw-r--r-- | net/bluetooth/hci_sock.c | 26 | 
1 files changed, 16 insertions, 10 deletions
diff --git a/net/bluetooth/hci_sock.c b/net/bluetooth/hci_sock.c index 6a6c8bb4fd72..7552f9e3089c 100644 --- a/net/bluetooth/hci_sock.c +++ b/net/bluetooth/hci_sock.c @@ -940,8 +940,22 @@ static int hci_sock_sendmsg(struct kiocb *iocb, struct socket *sock,  	bt_cb(skb)->pkt_type = *((unsigned char *) skb->data);  	skb_pull(skb, 1); -	if (hci_pi(sk)->channel == HCI_CHANNEL_RAW && -	    bt_cb(skb)->pkt_type == HCI_COMMAND_PKT) { +	if (hci_pi(sk)->channel == HCI_CHANNEL_USER) { +		/* No permission check is needed for user channel +		 * since that gets enforced when binding the socket. +		 * +		 * However check that the packet type is valid. +		 */ +		if (bt_cb(skb)->pkt_type != HCI_COMMAND_PKT && +		    bt_cb(skb)->pkt_type != HCI_ACLDATA_PKT && +		    bt_cb(skb)->pkt_type != HCI_SCODATA_PKT) { +			err = -EINVAL; +			goto drop; +		} + +		skb_queue_tail(&hdev->raw_q, skb); +		queue_work(hdev->workqueue, &hdev->tx_work); +	} else if (bt_cb(skb)->pkt_type == HCI_COMMAND_PKT) {  		u16 opcode = get_unaligned_le16(skb->data);  		u16 ogf = hci_opcode_ogf(opcode);  		u16 ocf = hci_opcode_ocf(opcode); @@ -972,14 +986,6 @@ static int hci_sock_sendmsg(struct kiocb *iocb, struct socket *sock,  			goto drop;  		} -		if (hci_pi(sk)->channel == HCI_CHANNEL_USER && -		    bt_cb(skb)->pkt_type != HCI_COMMAND_PKT && -		    bt_cb(skb)->pkt_type != HCI_ACLDATA_PKT && -		    bt_cb(skb)->pkt_type != HCI_SCODATA_PKT) { -			err = -EINVAL; -			goto drop; -		} -  		skb_queue_tail(&hdev->raw_q, skb);  		queue_work(hdev->workqueue, &hdev->tx_work);  	}  | 
