From 3558d8841d2aa23c8717e3249480c138232b1a72 Mon Sep 17 00:00:00 2001 From: Matthias Ringwald Date: Tue, 19 Sep 2017 17:11:13 +0200 Subject: [PATCH] sdp_util: add de_get_len_safe, use uint32_t for length functions --- src/classic/sdp_util.c | 16 ++++++++++++++-- src/classic/sdp_util.h | 9 +++++++-- 2 files changed, 21 insertions(+), 4 deletions(-) diff --git a/src/classic/sdp_util.c b/src/classic/sdp_util.c index 9be72813b..2a7dce94b 100644 --- a/src/classic/sdp_util.c +++ b/src/classic/sdp_util.c @@ -78,7 +78,7 @@ de_type_t de_get_element_type(const uint8_t *header){ return (de_type_t) (header[0] >> 3); } -int de_get_header_size(const uint8_t * header){ +uint32_t de_get_header_size(const uint8_t * header){ de_size_t de_size = de_get_size_type(header); if (de_size <= DE_SIZE_128) { return 1; @@ -86,7 +86,7 @@ int de_get_header_size(const uint8_t * header){ return 1 + (1 << (de_size-DE_SIZE_VAR_8)); } -int de_get_data_size(const uint8_t * header){ +uint32_t de_get_data_size(const uint8_t * header){ uint32_t result = 0; de_type_t de_type = de_get_element_type(header); de_size_t de_size = de_get_size_type(header); @@ -116,6 +116,18 @@ int de_get_len(const uint8_t *header){ return de_get_header_size(header) + de_get_data_size(header); } +// returns data element length if data element fits in size +uint32_t de_get_len_safe(const uint8_t * header, uint32_t size){ + if (1 > size) return 0; + uint32_t header_size = de_get_header_size(header); + if (header_size > size) return 0; + uint32_t data_size = de_get_data_size(header); + if (data_size > size) return 0; + uint32_t de_len = header_size + data_size; + if (de_len > size) return 0; + return de_len; +} + // @returns OK, if UINT16 value was read int de_element_get_uint16(const uint8_t * element, uint16_t * value){ if (de_get_size_type(element) != DE_SIZE_16) return 0; diff --git a/src/classic/sdp_util.h b/src/classic/sdp_util.h index 2e6d5e884..d0f74d8a6 100644 --- a/src/classic/sdp_util.h +++ b/src/classic/sdp_util.h @@ -76,11 +76,13 @@ typedef enum { // MARK: DateElement void de_dump_data_element(const uint8_t * record); int de_get_len(const uint8_t * header); + + de_size_t de_get_size_type(const uint8_t * header); de_type_t de_get_element_type(const uint8_t * header); -int de_get_header_size(const uint8_t * header); +uint32_t de_get_header_size(const uint8_t * header); int de_element_get_uint16(const uint8_t * element, uint16_t * value); -int de_get_data_size(const uint8_t * header); +uint32_t de_get_data_size(const uint8_t * header); uint32_t de_get_uuid32(const uint8_t * element); int de_get_normalized_uuid(uint8_t *uuid128, const uint8_t *element); @@ -93,6 +95,9 @@ void de_add_data( uint8_t *seq, de_type_t type, uint16_t size, uint8_t *dat void de_add_uuid128(uint8_t * seq, uint8_t * uuid); +// returns data element len if date element is smaller than size +uint32_t de_get_len_safe(const uint8_t * header, uint32_t size); + // MARK: DES iterator typedef struct { uint8_t * element;