55#include <tskit.h>
66
77// these are properties of the ``json+struct`` codec, documented in tskit
8- #define JSON_STRUCT_CODEC_HEADER_SIZE 21
8+ #define JSON_STRUCT_HEADER_SIZE 21
99
1010const uint8_t json_struct_codec_magic [4 ] = { 'J' , 'B' , 'L' , 'B' };
1111const uint8_t json_struct_codec_version = 1 ;
@@ -50,7 +50,7 @@ json_struct_codec_get_components(uint8_t *metadata, tsk_size_t metadata_length,
5050 if (metadata == NULL || json == NULL || json_length == NULL || binary == NULL
5151 || binary_length == NULL )
5252 errx (EXIT_FAILURE , "bad parameter value." );
53- if (metadata_length < JSON_STRUCT_CODEC_HEADER_SIZE )
53+ if (metadata_length < JSON_STRUCT_HEADER_SIZE )
5454 errx (EXIT_FAILURE , "metadata truncated." );
5555 if (memcmp (metadata , json_struct_codec_magic , sizeof (json_struct_codec_magic )) != 0 )
5656 errx (EXIT_FAILURE , "bad magic bytes." );
@@ -61,33 +61,30 @@ json_struct_codec_get_components(uint8_t *metadata, tsk_size_t metadata_length,
6161
6262 uint64_t json_length_u64 = load_u64_le (metadata + 5 );
6363 uint64_t binary_length_u64 = load_u64_le (metadata + 13 );
64- if (json_length_u64 > UINT64_MAX - (uint64_t ) JSON_STRUCT_CODEC_HEADER_SIZE )
64+ if (json_length_u64 > UINT64_MAX - (uint64_t ) JSON_STRUCT_HEADER_SIZE )
6565 errx (EXIT_FAILURE , "invalid length." );
6666
6767 // determine the number of padding bytes and do more safety checks
68- uint64_t header_and_json_length
69- = (uint64_t ) JSON_STRUCT_CODEC_HEADER_SIZE + json_length_u64 ;
70- uint64_t padding_length = (8 - (header_and_json_length & 0x07 )) % 8 ;
71- uint64_t header_and_json_and_padding_length
72- = header_and_json_length + padding_length ;
73- if (binary_length_u64 > UINT64_MAX - header_and_json_and_padding_length )
68+ uint64_t length = (uint64_t ) JSON_STRUCT_HEADER_SIZE + json_length_u64 ;
69+ uint64_t padding_length = (8 - (length & 0x07 )) % 8 ;
70+ length += padding_length ;
71+ if (binary_length_u64 > UINT64_MAX - length )
7472 errx (EXIT_FAILURE , "invalid length." );
7573
76- uint64_t total_length = header_and_json_and_padding_length + binary_length_u64 ;
77- if ((uint64_t ) metadata_length != total_length )
74+ length += binary_length_u64 ;
75+ if ((uint64_t ) metadata_length != length )
7876 errx (EXIT_FAILURE , "unexpected size." );
7977
80- uint8_t * padding_start = metadata + JSON_STRUCT_CODEC_HEADER_SIZE + json_length_u64 ;
81- for (uint64_t padding_index = 0 ; padding_index < padding_length ; ++ padding_index )
82- if (* (padding_start + padding_index ) != 0 )
78+ uint8_t * padding_start = metadata + JSON_STRUCT_HEADER_SIZE + json_length_u64 ;
79+ for (uint64_t j = 0 ; j < padding_length ; ++ j )
80+ if (* (padding_start + j ) != 0 )
8381 errx (EXIT_FAILURE , "padding bytes are nonzero." );
8482
8583 // the structure of the codec data seems valid; return components
86- * json = metadata + JSON_STRUCT_CODEC_HEADER_SIZE ;
84+ * json = metadata + JSON_STRUCT_HEADER_SIZE ;
8785 * json_length = (tsk_size_t ) json_length_u64 ;
8886
89- * binary
90- = metadata + JSON_STRUCT_CODEC_HEADER_SIZE + json_length_u64 + padding_length ;
87+ * binary = metadata + JSON_STRUCT_HEADER_SIZE + json_length_u64 + padding_length ;
9188 * binary_length = (tsk_size_t ) binary_length_u64 ;
9289}
9390
@@ -99,7 +96,7 @@ json_struct_codec_create_buffer(const uint8_t *json, tsk_size_t json_length,
9996 tsk_size_t * buffer_length )
10097{
10198 // figure out the total length of the codec's data and allocate the buffer for it
102- tsk_size_t header_length = JSON_STRUCT_CODEC_HEADER_SIZE ;
99+ tsk_size_t header_length = JSON_STRUCT_HEADER_SIZE ;
103100 tsk_size_t padding_length = (8 - ((header_length + json_length ) & 0x07 )) % 8 ;
104101 tsk_size_t total_length
105102 = header_length + json_length + padding_length + binary_length ;
0 commit comments