Bluetooth: Fix issue with shared SKB between HCI raw socket and driver
authorMarcel Holtmann <marcel@holtmann.org>
Mon, 20 Feb 2012 13:50:36 +0000 (14:50 +0100)
committerJohan Hedberg <johan.hedberg@intel.com>
Mon, 20 Feb 2012 13:59:11 +0000 (15:59 +0200)
commite0edf3733fb62f91bbb8ec3fab4a90b0ac2dd037
tree59e8d01b911454141d53c4e08d9af9ed271abdcf
parent7cc2ade2cbc6f71090f0f8d0e11cb68886ddc65e
Bluetooth: Fix issue with shared SKB between HCI raw socket and driver

Any HCI raw socket gets a copy of each SKB that is either received or
send via the Bluetooth subsystem. The raw socket uses SKB clones to
send out data, but the problem is that it needs to add an extra packet
type byte in front of it. And some drivers need to also add an extra
header before submitting the packet.

So far this all worked magically fine since all of the drivers and the
raw sockets are adding the same byte at the same location. But that is
by pure coincidence. Since the data of cloned SKBs is shared, this means
that the raw socket and driver kept writing into the shared data area.

To fix this the only safe way is if the HCI raw socket creates a copy of
the SKB before sending it out. To not always copy all SKBs around, the
copy is only created once and only after any of the HCI filter checks
succeeded.

Signed-off-by: Marcel Holtmann <marcel@holtmann.org>
Signed-off-by: Johan Hedberg <johan.hedberg@intel.com>
net/bluetooth/hci_sock.c