Bluetooth: Fix invalid-free in bcsp_close()
authorTomas Bortoli <tomasbortoli@gmail.com>
Fri, 1 Nov 2019 20:42:44 +0000 (21:42 +0100)
committerMarcel Holtmann <marcel@holtmann.org>
Mon, 4 Nov 2019 14:19:02 +0000 (15:19 +0100)
Syzbot reported an invalid-free that I introduced fixing a memleak.

bcsp_recv() also frees bcsp->rx_skb but never nullifies its value.
Nullify bcsp->rx_skb every time it is freed.

Signed-off-by: Tomas Bortoli <tomasbortoli@gmail.com>
Reported-by: syzbot+a0d209a4676664613e76@syzkaller.appspotmail.com
Signed-off-by: Marcel Holtmann <marcel@holtmann.org>
drivers/bluetooth/hci_bcsp.c

index fe2e307009f472e7158e914fd3865ecd9b242236..cf4a560958173af884597768cc72c102b1b23804 100644 (file)
@@ -591,6 +591,7 @@ static int bcsp_recv(struct hci_uart *hu, const void *data, int count)
                        if (*ptr == 0xc0) {
                                BT_ERR("Short BCSP packet");
                                kfree_skb(bcsp->rx_skb);
+                               bcsp->rx_skb = NULL;
                                bcsp->rx_state = BCSP_W4_PKT_START;
                                bcsp->rx_count = 0;
                        } else
@@ -606,6 +607,7 @@ static int bcsp_recv(struct hci_uart *hu, const void *data, int count)
                            bcsp->rx_skb->data[2])) != bcsp->rx_skb->data[3]) {
                                BT_ERR("Error in BCSP hdr checksum");
                                kfree_skb(bcsp->rx_skb);
+                               bcsp->rx_skb = NULL;
                                bcsp->rx_state = BCSP_W4_PKT_DELIMITER;
                                bcsp->rx_count = 0;
                                continue;
@@ -630,6 +632,7 @@ static int bcsp_recv(struct hci_uart *hu, const void *data, int count)
                                       bscp_get_crc(bcsp));
 
                                kfree_skb(bcsp->rx_skb);
+                               bcsp->rx_skb = NULL;
                                bcsp->rx_state = BCSP_W4_PKT_DELIMITER;
                                bcsp->rx_count = 0;
                                continue;