struct sdu *sdu = NULL;
        u8 endian = phy_dev->get_endian(phy_dev->priv_dev);
        u8 *data = (u8 *)multi_sdu->data;
+       int copied;
        u16 i = 0;
        u16 num_packet;
        u16 hci_len;
        num_packet = gdm_dev16_to_cpu(endian, multi_sdu->num_packet);
 
        for (i = 0; i < num_packet; i++) {
+               copied = data - multi_sdu->data;
+               if (len < copied + sizeof(*sdu)) {
+                       pr_err("rx prevent buffer overflow");
+                       return;
+               }
+
                sdu = (struct sdu *)data;
 
                cmd_evt  = gdm_dev16_to_cpu(endian, sdu->cmd_evt);
                        pr_err("rx sdu wrong hci %04x\n", cmd_evt);
                        return;
                }
-               if (hci_len < 12) {
+               if (hci_len < 12 ||
+                   len < copied + sizeof(*sdu) + (hci_len - 12)) {
                        pr_err("rx sdu invalid len %d\n", hci_len);
                        return;
                }