Message ID | 20230403122430.1024235-4-neeraj.sanjaykale@nxp.com |
---|---|
State | Accepted |
Commit | b1ff41fd0ee651b2024e84359ff90640533c68fd |
Headers | show |
Series | [v1] Bluetooth: btnxpuart: No need to check the received bootloader signature | expand |
Hello: This patch was applied to bluetooth/bluetooth-next.git (master) by Luiz Augusto von Dentz <luiz.von.dentz@intel.com>: On Mon, 3 Apr 2023 17:54:30 +0530 you wrote: > We can never assume the uart will deliver a complete packet to the BT > layer at once, the expected packet may be divided into several parts by > uart as uart doesn't know the received packet size, the received data > count may mismatch with the expected packet size, so here > is_valid_bootloader_signature() check may always return false. > > Even we remove the count check in is_valid_bootloader_signature(), then > the first part of the data which includes the packet type can pass the > is_valid_bootloader_signature() check, but the remaining parts don't > have the packet type data still cannot pass the check, here return > directly will cause the data loss. > > [...] Here is the summary with links: - [v1] Bluetooth: btnxpuart: No need to check the received bootloader signature https://git.kernel.org/bluetooth/bluetooth-next/c/b1ff41fd0ee6 You are awesome, thank you!
diff --git a/drivers/bluetooth/btnxpuart.c b/drivers/bluetooth/btnxpuart.c index 5f641466d695..7c22c1ac087a 100644 --- a/drivers/bluetooth/btnxpuart.c +++ b/drivers/bluetooth/btnxpuart.c @@ -1147,33 +1147,20 @@ static const struct h4_recv_pkt nxp_recv_pkts[] = { { NXP_RECV_FW_REQ_V3, .recv = nxp_recv_fw_req_v3 }, }; -static bool is_valid_bootloader_signature(const u8 *data, size_t count) -{ - if ((*data == NXP_V1_FW_REQ_PKT && count == sizeof(struct v1_data_req) + 1) || - (*data == NXP_V3_FW_REQ_PKT && count == sizeof(struct v3_data_req) + 1) || - (*data == NXP_V3_CHIP_VER_PKT && count == sizeof(struct v3_start_ind) + 1)) - return true; - else - return false; -} - static int btnxpuart_receive_buf(struct serdev_device *serdev, const u8 *data, size_t count) { struct btnxpuart_dev *nxpdev = serdev_device_get_drvdata(serdev); - if (is_fw_downloading(nxpdev) && !is_valid_bootloader_signature(data, count)) { - /* Unknown bootloader signature, skip without returning error */ - return count; - } - ps_start_timer(nxpdev); nxpdev->rx_skb = h4_recv_buf(nxpdev->hdev, nxpdev->rx_skb, data, count, nxp_recv_pkts, ARRAY_SIZE(nxp_recv_pkts)); if (IS_ERR(nxpdev->rx_skb)) { int err = PTR_ERR(nxpdev->rx_skb); - + /* Safe to ignore out-of-sync bootloader signatures */ + if (is_fw_downloading(nxpdev)) + return count; bt_dev_err(nxpdev->hdev, "Frame reassembly failed (%d)", err); nxpdev->rx_skb = NULL; return err;