Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Bluetooth: hci_uart: check the return value of recv()

Check the return value of hu->proto->recv() in hci_uart_tty_receive()
the recv() may return error, check it, not add this to statistics.

Signed-off-by: Jiejing Zhang <jiejing.zhang@freescale.com>
Signed-off-by: Gustavo F. Padovan <padovan@profusion.mobi>

authored by

Jiejing Zhang and committed by
Gustavo F. Padovan
78b4a56c e1ba1f15

+10 -3
+6 -1
drivers/bluetooth/hci_ath.c
··· 201 201 /* Recv data */ 202 202 static int ath_recv(struct hci_uart *hu, void *data, int count) 203 203 { 204 - if (hci_recv_stream_fragment(hu->hdev, data, count) < 0) 204 + int ret; 205 + 206 + ret = hci_recv_stream_fragment(hu->hdev, data, count); 207 + if (ret < 0) { 205 208 BT_ERR("Frame Reassembly Failed"); 209 + return ret; 210 + } 206 211 207 212 return count; 208 213 }
+4 -2
drivers/bluetooth/hci_ldisc.c
··· 359 359 */ 360 360 static void hci_uart_tty_receive(struct tty_struct *tty, const u8 *data, char *flags, int count) 361 361 { 362 + int ret; 362 363 struct hci_uart *hu = (void *)tty->disc_data; 363 364 364 365 if (!hu || tty != hu->tty) ··· 369 368 return; 370 369 371 370 spin_lock(&hu->rx_lock); 372 - hu->proto->recv(hu, (void *) data, count); 373 - hu->hdev->stat.byte_rx += count; 371 + ret = hu->proto->recv(hu, (void *) data, count); 372 + if (ret > 0) 373 + hu->hdev->stat.byte_rx += count; 374 374 spin_unlock(&hu->rx_lock); 375 375 376 376 tty_unthrottle(tty);