Skip to content

Commit

Permalink
NFC: hci: Split memcpy() of struct hcp_message flexible array
Browse files Browse the repository at this point in the history
To work around a misbehavior of the compiler's ability to see into
composite flexible array structs (as detailed in the coming memcpy()
hardening series[1]), split the memcpy() of the header and the payload
so no false positive run-time overflow warning will be generated. This
split already existed for the "firstfrag" case, so just generalize the
logic further.

[1] https://lore.kernel.org/linux-hardening/[email protected]/

Cc: Eric Dumazet <[email protected]>
Cc: Paolo Abeni <[email protected]>
Reported-by: "Gustavo A. R. Silva" <[email protected]>
Signed-off-by: Kees Cook <[email protected]>
Reviewed-by: Gustavo A. R. Silva <[email protected]>
Reviewed-by: Krzysztof Kozlowski <[email protected]>
Link: https://lore.kernel.org/r/[email protected]
Signed-off-by: Jakub Kicinski <[email protected]>
  • Loading branch information
kees authored and kuba-moo committed Sep 27, 2022
1 parent 454b20e commit de4feb4
Showing 1 changed file with 5 additions and 7 deletions.
12 changes: 5 additions & 7 deletions net/nfc/hci/hcp.c
Original file line number Diff line number Diff line change
Expand Up @@ -73,14 +73,12 @@ int nfc_hci_hcp_message_tx(struct nfc_hci_dev *hdev, u8 pipe,
if (firstfrag) {
firstfrag = false;
packet->message.header = HCP_HEADER(type, instruction);
if (ptr) {
memcpy(packet->message.data, ptr,
data_link_len - 1);
ptr += data_link_len - 1;
}
} else {
memcpy(&packet->message, ptr, data_link_len);
ptr += data_link_len;
packet->message.header = *ptr++;
}
if (ptr) {
memcpy(packet->message.data, ptr, data_link_len - 1);
ptr += data_link_len - 1;
}

/* This is the last fragment, set the cb bit */
Expand Down

0 comments on commit de4feb4

Please sign in to comment.