sdp_util: add de_get_len_safe, use uint32_t for length functions

This commit is contained in:
Matthias Ringwald 2017-09-19 17:11:13 +02:00
parent cbdfe9f7d6
commit 3558d8841d
2 changed files with 21 additions and 4 deletions

View File

@ -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;

View File

@ -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;