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>
Fri, 29 Nov 2019 09:09:39 +0000 (10:09 +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 fe2e307..cf4a560 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;