Bluetooth: Fix invalid-free in bcsp_close()
authorTomas Bortoli <tomasbortoli@gmail.com>
Fri, 1 Nov 2019 20:42:44 +0000 (21:42 +0100)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Sun, 1 Dec 2019 08:14:15 +0000 (09:14 +0100)
commit cf94da6f502d8caecabd56b194541c873c8a7a3c upstream.

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>
Cc: Alexander Potapenko <glider@google.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/bluetooth/hci_bcsp.c

index 57a7f4255ac00405a6451bf22e10cf1adf5a817d..ee6c403de6af1e76458296afdc7aab68281d3c4a 100644 (file)
@@ -605,6 +605,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
@@ -620,6 +621,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;
@@ -644,6 +646,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;