|
@@ -489,7 +489,8 @@ int fmc_send_cmd(struct fmdev *fmdev, u8 fm_op, u16 type, void *payload,
|
|
|
return -EIO;
|
|
return -EIO;
|
|
|
}
|
|
}
|
|
|
/* Send response data to caller */
|
|
/* Send response data to caller */
|
|
|
- if (response != NULL && response_len != NULL && evt_hdr->dlen) {
|
|
|
|
|
|
|
+ if (response != NULL && response_len != NULL && evt_hdr->dlen &&
|
|
|
|
|
+ evt_hdr->dlen <= payload_len) {
|
|
|
/* Skip header info and copy only response data */
|
|
/* Skip header info and copy only response data */
|
|
|
skb_pull(skb, sizeof(struct fm_event_msg_hdr));
|
|
skb_pull(skb, sizeof(struct fm_event_msg_hdr));
|
|
|
memcpy(response, skb->data, evt_hdr->dlen);
|
|
memcpy(response, skb->data, evt_hdr->dlen);
|
|
@@ -583,6 +584,8 @@ static void fm_irq_handle_flag_getcmd_resp(struct fmdev *fmdev)
|
|
|
return;
|
|
return;
|
|
|
|
|
|
|
|
fm_evt_hdr = (void *)skb->data;
|
|
fm_evt_hdr = (void *)skb->data;
|
|
|
|
|
+ if (fm_evt_hdr->dlen > sizeof(fmdev->irq_info.flag))
|
|
|
|
|
+ return;
|
|
|
|
|
|
|
|
/* Skip header info and copy only response data */
|
|
/* Skip header info and copy only response data */
|
|
|
skb_pull(skb, sizeof(struct fm_event_msg_hdr));
|
|
skb_pull(skb, sizeof(struct fm_event_msg_hdr));
|
|
@@ -1308,7 +1311,7 @@ static int load_default_rx_configuration(struct fmdev *fmdev)
|
|
|
static int fm_power_up(struct fmdev *fmdev, u8 mode)
|
|
static int fm_power_up(struct fmdev *fmdev, u8 mode)
|
|
|
{
|
|
{
|
|
|
u16 payload;
|
|
u16 payload;
|
|
|
- __be16 asic_id, asic_ver;
|
|
|
|
|
|
|
+ __be16 asic_id = 0, asic_ver = 0;
|
|
|
int resp_len, ret;
|
|
int resp_len, ret;
|
|
|
u8 fw_name[50];
|
|
u8 fw_name[50];
|
|
|
|
|
|