packet_structs: check data length in layer2_decode_packet_header()
This commit is contained in:
parent
153ff61dcd
commit
402e36dda5
|
@ -33,13 +33,27 @@ size_t layer2_encode_packet_header(const layer2_packet_header_t *header, uint8_t
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
bool layer2_decode_packet_header(const uint8_t *encoded, layer2_packet_header_t *header)
|
bool layer2_decode_packet_header(const uint8_t *encoded, size_t encoded_len, layer2_packet_header_t *header)
|
||||||
{
|
{
|
||||||
|
// check if there are enough bytes for the minimum header size:
|
||||||
|
// - 1 byte packet info
|
||||||
|
// - 1 byte sequence numbers
|
||||||
|
// - 2 bytes source address
|
||||||
|
// - 2 bytes destination address
|
||||||
|
if(encoded_len < 6) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
header->msg_type = (encoded[0] >> 5) & 0x7;
|
header->msg_type = (encoded[0] >> 5) & 0x7;
|
||||||
header->tx_request = (encoded[0] & 0x10) != 0;
|
header->tx_request = (encoded[0] & 0x10) != 0;
|
||||||
header->src_addr.length = (encoded[0] >> 2) & 0x3 + 1;
|
header->src_addr.length = (encoded[0] >> 2) & 0x3 + 1;
|
||||||
header->dst_addr.length = (encoded[0] >> 0) & 0x3 + 1;
|
header->dst_addr.length = (encoded[0] >> 0) & 0x3 + 1;
|
||||||
|
|
||||||
|
// check for the actually needed size
|
||||||
|
if(encoded_len < (2 + 2*header->src_addr.length + 2*header->dst_addr.length)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
header->tx_seq_nr = (encoded[1] >> 4) & 0xF;
|
header->tx_seq_nr = (encoded[1] >> 4) & 0xF;
|
||||||
header->tx_seq_nr = (encoded[1] >> 0) & 0xF;
|
header->tx_seq_nr = (encoded[1] >> 0) & 0xF;
|
||||||
|
|
||||||
|
|
|
@ -19,8 +19,8 @@ typedef struct layer2_packet_header_s {
|
||||||
layer2_message_type_t msg_type; //!< message type
|
layer2_message_type_t msg_type; //!< message type
|
||||||
bool tx_request; //!< transmission request (marks the end of the burst)
|
bool tx_request; //!< transmission request (marks the end of the burst)
|
||||||
|
|
||||||
uint8_t tx_seq_nr; //!< sequence number of this packet
|
uint8_t tx_seq_nr; //!< sequence number (0 to 15) of this packet
|
||||||
uint8_t rx_seq_nr; //!< sequence number expected next from he other side
|
uint8_t rx_seq_nr; //!< sequence number (0 to 15) expected next from he other side
|
||||||
|
|
||||||
ham64_t src_addr; //!< source HAM-64 address
|
ham64_t src_addr; //!< source HAM-64 address
|
||||||
ham64_t dst_addr; //!< destination HAM-64 address
|
ham64_t dst_addr; //!< destination HAM-64 address
|
||||||
|
@ -34,11 +34,12 @@ typedef struct layer2_packet_header_s {
|
||||||
size_t layer2_encode_packet_header(const layer2_packet_header_t *header, uint8_t *encoded);
|
size_t layer2_encode_packet_header(const layer2_packet_header_t *header, uint8_t *encoded);
|
||||||
|
|
||||||
/*!\brief Decode a layer2 packet header from the received form.
|
/*!\brief Decode a layer2 packet header from the received form.
|
||||||
* \param encoded A byte array containing the received header.
|
* \param encoded A byte array containing the received header.
|
||||||
* \param header The header structure where the decoded information is stored.
|
* \param encoded_len Length (in bytes) of the given encoded data.
|
||||||
* \returns Whether the header was decoded successfully.
|
* \param header The header structure where the decoded information is stored.
|
||||||
|
* \returns Whether the header was decoded successfully.
|
||||||
*/
|
*/
|
||||||
bool layer2_decode_packet_header(const uint8_t *encoded, layer2_packet_header_t *header);
|
bool layer2_decode_packet_header(const uint8_t *encoded, size_t encoded_len, layer2_packet_header_t *header);
|
||||||
|
|
||||||
/* Data Packet Structs */
|
/* Data Packet Structs */
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue