]> www.infradead.org Git - users/dwmw2/linux.git/commitdiff
Bluetooth: hci_core: Fix not checking skb length on hci_scodata_packet
authorLuiz Augusto von Dentz <luiz.von.dentz@intel.com>
Tue, 8 Oct 2024 15:33:15 +0000 (11:33 -0400)
committerLuiz Augusto von Dentz <luiz.von.dentz@intel.com>
Thu, 14 Nov 2024 20:30:14 +0000 (15:30 -0500)
This fixes not checking if skb really contains an SCO header otherwise
the code may attempt to access some uninitilized/invalid memory past the
valid skb->data.

Signed-off-by: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>
net/bluetooth/hci_core.c

index f9e1df409015952843d7bddb38c9c08e4fdcfa83..f6cff34a85421c4e9f1593a90abd0802fab3598a 100644 (file)
@@ -3814,18 +3814,22 @@ drop:
 /* SCO data packet */
 static void hci_scodata_packet(struct hci_dev *hdev, struct sk_buff *skb)
 {
-       struct hci_sco_hdr *hdr = (void *) skb->data;
+       struct hci_sco_hdr *hdr;
        struct hci_conn *conn;
        __u16 handle, flags;
 
-       skb_pull(skb, HCI_SCO_HDR_SIZE);
+       hdr = skb_pull_data(skb, sizeof(*hdr));
+       if (!hdr) {
+               bt_dev_err(hdev, "SCO packet too small");
+               goto drop;
+       }
 
        handle = __le16_to_cpu(hdr->handle);
        flags  = hci_flags(handle);
        handle = hci_handle(handle);
 
-       BT_DBG("%s len %d handle 0x%4.4x flags 0x%4.4x", hdev->name, skb->len,
-              handle, flags);
+       bt_dev_dbg(hdev, "len %d handle 0x%4.4x flags 0x%4.4x", skb->len,
+                  handle, flags);
 
        hdev->stat.sco_rx++;
 
@@ -3843,6 +3847,7 @@ static void hci_scodata_packet(struct hci_dev *hdev, struct sk_buff *skb)
                                       handle);
        }
 
+drop:
        kfree_skb(skb);
 }