sdp_util: assert 16-bit DES is used for builder functions

This commit is contained in:
Matthias Ringwald 2023-08-08 11:04:32 +02:00
parent 2ea455e190
commit 80a6e57ee9
2 changed files with 37 additions and 28 deletions

View File

@ -206,70 +206,79 @@ void de_create_sequence(uint8_t *header){
de_store_descriptor_with_len( header, DE_DES, DE_SIZE_VAR_16, 0); // DES, 2 Byte Length de_store_descriptor_with_len( header, DE_DES, DE_SIZE_VAR_16, 0); // DES, 2 Byte Length
} }
static inline void de_assert_des_16bit(uint8_t * element){
btstack_assert(element[0] == ((DE_DES << 3) | DE_SIZE_VAR_16));
}
/* starts a sub-sequence, @return handle for sub-sequence */ /* starts a sub-sequence, @return handle for sub-sequence */
uint8_t * de_push_sequence(uint8_t *header){ uint8_t * de_push_sequence(uint8_t *sequence){
int element_len = de_get_len(header); de_assert_des_16bit(sequence);
de_store_descriptor_with_len(header+element_len, DE_DES, DE_SIZE_VAR_16, 0); // DES, 2 Byte Length int element_len = de_get_len(sequence);
return header + element_len; de_store_descriptor_with_len(sequence + element_len, DE_DES, DE_SIZE_VAR_16, 0); // DES, 2 Byte Length
return sequence + element_len;
} }
/* closes the current sequence and updates the parent sequence */ /* closes the current sequence and updates the parent sequence */
void de_pop_sequence(uint8_t * parent, uint8_t * child){ void de_pop_sequence(uint8_t * parent, uint8_t * child){
de_assert_des_16bit(parent);
int child_len = de_get_len(child); int child_len = de_get_len(child);
int data_size_parent = big_endian_read_16(parent,1); int data_size_parent = big_endian_read_16(parent,1);
big_endian_store_16(parent, 1, data_size_parent + child_len); big_endian_store_16(parent, 1, data_size_parent + child_len);
} }
/* adds a single number value and 16+32 bit UUID to the sequence */ /* adds a single number value and 16+32 bit UUID to the sequence */
void de_add_number(uint8_t *seq, de_type_t type, de_size_t size, uint32_t value){ void de_add_number(uint8_t *sequence, de_type_t type, de_size_t size, uint32_t value){
int data_size = big_endian_read_16(seq,1); de_assert_des_16bit(sequence);
int data_size = big_endian_read_16(sequence, 1);
int element_size = 1; // e.g. for DE_TYPE_NIL int element_size = 1; // e.g. for DE_TYPE_NIL
de_store_descriptor(seq+3+data_size, type, size); de_store_descriptor(sequence + 3 + data_size, type, size);
switch (size){ switch (size){
case DE_SIZE_8: case DE_SIZE_8:
if (type != DE_NIL){ if (type != DE_NIL){
seq[4+data_size] = value; sequence[4 + data_size] = value;
element_size = 2; element_size = 2;
} }
break; break;
case DE_SIZE_16: case DE_SIZE_16:
big_endian_store_16(seq, 4+data_size, value); big_endian_store_16(sequence, 4 + data_size, value);
element_size = 3; element_size = 3;
break; break;
case DE_SIZE_32: case DE_SIZE_32:
big_endian_store_32(seq, 4+data_size, value); big_endian_store_32(sequence, 4 + data_size, value);
element_size = 5; element_size = 5;
break; break;
default: default:
break; break;
} }
big_endian_store_16(seq, 1, data_size+element_size); big_endian_store_16(sequence, 1, data_size + element_size);
} }
/* add a single block of data, e.g. as DE_STRING, DE_URL */ /* add a single block of data, e.g. as DE_STRING, DE_URL */
void de_add_data( uint8_t *seq, de_type_t type, uint16_t size, uint8_t *data){ void de_add_data(uint8_t *sequence, de_type_t type, uint16_t size, uint8_t *data){
int data_size = big_endian_read_16(seq,1); de_assert_des_16bit(sequence);
int data_size = big_endian_read_16(sequence, 1);
if (size > 0xff) { if (size > 0xff) {
// use 16-bit lengh information (3 byte header) // use 16-bit length information (3 byte header)
de_store_descriptor_with_len(seq+3+data_size, type, DE_SIZE_VAR_16, size); de_store_descriptor_with_len(sequence + 3 + data_size, type, DE_SIZE_VAR_16, size);
data_size += 3; data_size += 3;
} else { } else {
// use 8-bit lengh information (2 byte header) // use 8-bit length information (2 byte header)
de_store_descriptor_with_len(seq+3+data_size, type, DE_SIZE_VAR_8, size); de_store_descriptor_with_len(sequence + 3 + data_size, type, DE_SIZE_VAR_8, size);
data_size += 2; data_size += 2;
} }
if (size > 0){ if (size > 0){
(void)memcpy(seq + 3 + data_size, data, size); (void)memcpy(sequence + 3 + data_size, data, size);
data_size += size; data_size += size;
} }
big_endian_store_16(seq, 1, data_size); big_endian_store_16(sequence, 1, data_size);
} }
void de_add_uuid128(uint8_t * seq, uint8_t * uuid){ void de_add_uuid128(uint8_t * sequence, uint8_t * uuid){
int data_size = big_endian_read_16(seq,1); de_assert_des_16bit(sequence);
de_store_descriptor(seq+3+data_size, DE_UUID, DE_SIZE_128); int data_size = big_endian_read_16(sequence, 1);
(void)memcpy(seq + 4 + data_size, uuid, 16); de_store_descriptor(sequence + 3 + data_size, DE_UUID, DE_SIZE_128);
big_endian_store_16(seq, 1, data_size+1+16); (void)memcpy(sequence + 4 + data_size, uuid, 16);
big_endian_store_16(sequence, 1, data_size + 1 + 16);
} }
// MARK: DES iterator // MARK: DES iterator

View File

@ -111,12 +111,12 @@ uint32_t de_get_uuid32(const uint8_t * element);
int de_get_normalized_uuid(uint8_t *uuid128, const uint8_t *element); int de_get_normalized_uuid(uint8_t *uuid128, const uint8_t *element);
void de_create_sequence(uint8_t * header); void de_create_sequence(uint8_t * header);
void de_store_descriptor_with_len(uint8_t * header, de_type_t type, de_size_t size, uint32_t len); void de_store_descriptor_with_len(uint8_t * header, de_type_t type, de_size_t size, uint32_t len);
uint8_t * de_push_sequence(uint8_t *header); uint8_t * de_push_sequence(uint8_t *sequence);
void de_pop_sequence(uint8_t * parent, uint8_t * child); void de_pop_sequence(uint8_t * parent, uint8_t * child);
void de_add_number(uint8_t *seq, de_type_t type, de_size_t size, uint32_t value); void de_add_number(uint8_t *sequence, de_type_t type, de_size_t size, uint32_t value);
void de_add_data( uint8_t *seq, de_type_t type, uint16_t size, uint8_t *data); void de_add_data(uint8_t *sequence, de_type_t type, uint16_t size, uint8_t *data);
void de_add_uuid128(uint8_t * seq, uint8_t * uuid); void de_add_uuid128(uint8_t * sequence, uint8_t * uuid);
// returns data element len if date element is smaller than size // returns data element len if date element is smaller than size
uint32_t de_get_len_safe(const uint8_t * header, uint32_t size); uint32_t de_get_len_safe(const uint8_t * header, uint32_t size);