Skip to content

Commit 81ce9f8

Browse files
committed
Return both json and blob
1 parent 47d86c9 commit 81ce9f8

File tree

3 files changed

+53
-23
lines changed

3 files changed

+53
-23
lines changed

c/tests/test_core.c

Lines changed: 31 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,8 @@ test_json_binary_metadata_get_blob(void)
101101
{
102102
int ret;
103103
char metadata[128];
104+
const char *json;
105+
tsk_size_t json_buffer_length;
104106
const uint8_t *blob;
105107
tsk_size_t blob_length;
106108
uint8_t *bytes;
@@ -131,8 +133,13 @@ test_json_binary_metadata_get_blob(void)
131133
memcpy(bytes + header_length + json_length, binary_payload, payload_length);
132134
metadata_length = (tsk_size_t) total_length;
133135
ret = tsk_json_binary_metadata_get_blob(
134-
metadata, metadata_length, &blob, &blob_length);
136+
metadata, metadata_length, &json, &json_buffer_length, &blob, &blob_length);
135137
CU_ASSERT_EQUAL(ret, 0);
138+
CU_ASSERT_PTR_EQUAL(json, (const char *) bytes + header_length);
139+
CU_ASSERT_EQUAL(json_buffer_length, (tsk_size_t) json_length);
140+
if (json_length > 0) {
141+
CU_ASSERT_EQUAL(memcmp(json, json_payload, json_length), 0);
142+
}
136143
CU_ASSERT_PTR_EQUAL(blob, bytes + header_length + json_length);
137144
CU_ASSERT_EQUAL(blob_length, (tsk_size_t) payload_length);
138145
CU_ASSERT_EQUAL(memcmp(blob, binary_payload, payload_length), 0);
@@ -143,8 +150,10 @@ test_json_binary_metadata_get_blob(void)
143150
set_u64_le(bytes + 13, (uint64_t) payload_length);
144151
metadata_length = (tsk_size_t) total_length;
145152
ret = tsk_json_binary_metadata_get_blob(
146-
metadata, metadata_length, &blob, &blob_length);
153+
metadata, metadata_length, &json, &json_buffer_length, &blob, &blob_length);
147154
CU_ASSERT_EQUAL(ret, 0);
155+
CU_ASSERT_PTR_EQUAL(json, (const char *) bytes + header_length);
156+
CU_ASSERT_EQUAL(json_buffer_length, (tsk_size_t) json_length);
148157
CU_ASSERT_EQUAL(blob_length, (tsk_size_t) payload_length);
149158
CU_ASSERT_PTR_EQUAL(blob, bytes + header_length + json_length);
150159

@@ -157,43 +166,55 @@ test_json_binary_metadata_get_blob(void)
157166
memcpy(bytes + header_length + json_length, empty_payload, payload_length);
158167
metadata_length = (tsk_size_t) total_length;
159168
ret = tsk_json_binary_metadata_get_blob(
160-
metadata, metadata_length, &blob, &blob_length);
169+
metadata, metadata_length, &json, &json_buffer_length, &blob, &blob_length);
161170
CU_ASSERT_EQUAL(ret, 0);
171+
CU_ASSERT_PTR_EQUAL(json, (const char *) bytes + header_length);
172+
CU_ASSERT_EQUAL(json_buffer_length, (tsk_size_t) json_length);
162173
CU_ASSERT_EQUAL(blob_length, (tsk_size_t) payload_length);
163174
CU_ASSERT_PTR_EQUAL(blob, bytes + header_length + json_length);
164175
CU_ASSERT_EQUAL(memcmp(blob, empty_payload, payload_length), 0);
165176

166177
blob = NULL;
167178
blob_length = 0;
179+
json = NULL;
180+
json_buffer_length = 0;
168181
metadata_length = header_length - 1;
169182
ret = tsk_json_binary_metadata_get_blob(
170-
metadata, metadata_length, &blob, &blob_length);
183+
metadata, metadata_length, &json, &json_buffer_length, &blob, &blob_length);
171184
CU_ASSERT_EQUAL(ret, TSK_ERR_FILE_FORMAT);
172185

173186
metadata_length = (tsk_size_t) total_length;
174187
bytes[0] = 'X';
175188
ret = tsk_json_binary_metadata_get_blob(
176-
metadata, metadata_length, &blob, &blob_length);
189+
metadata, metadata_length, &json, &json_buffer_length, &blob, &blob_length);
177190
CU_ASSERT_EQUAL(ret, TSK_ERR_FILE_FORMAT);
178191
bytes[0] = 'J';
179192

180193
bytes[4] = 2;
181194
ret = tsk_json_binary_metadata_get_blob(
182-
metadata, metadata_length, &blob, &blob_length);
195+
metadata, metadata_length, &json, &json_buffer_length, &blob, &blob_length);
183196
CU_ASSERT_EQUAL(ret, TSK_ERR_FILE_VERSION_TOO_NEW);
184197
bytes[4] = 1;
185198

186199
metadata_length = (tsk_size_t)(total_length - 1);
187200
ret = tsk_json_binary_metadata_get_blob(
188-
metadata, metadata_length, &blob, &blob_length);
201+
metadata, metadata_length, &json, &json_buffer_length, &blob, &blob_length);
189202
CU_ASSERT_EQUAL(ret, TSK_ERR_FILE_FORMAT);
190203

191-
ret = tsk_json_binary_metadata_get_blob(NULL, metadata_length, &blob, &blob_length);
204+
ret = tsk_json_binary_metadata_get_blob(
205+
NULL, metadata_length, &json, &json_buffer_length, &blob, &blob_length);
206+
CU_ASSERT_EQUAL(ret, TSK_ERR_BAD_PARAM_VALUE);
207+
ret = tsk_json_binary_metadata_get_blob(
208+
metadata, metadata_length, NULL, &json_buffer_length, &blob, &blob_length);
192209
CU_ASSERT_EQUAL(ret, TSK_ERR_BAD_PARAM_VALUE);
193210
ret = tsk_json_binary_metadata_get_blob(
194-
metadata, metadata_length, NULL, &blob_length);
211+
metadata, metadata_length, &json, NULL, &blob, &blob_length);
195212
CU_ASSERT_EQUAL(ret, TSK_ERR_BAD_PARAM_VALUE);
196-
ret = tsk_json_binary_metadata_get_blob(metadata, metadata_length, &blob, NULL);
213+
ret = tsk_json_binary_metadata_get_blob(
214+
metadata, metadata_length, &json, &json_buffer_length, NULL, &blob_length);
215+
CU_ASSERT_EQUAL(ret, TSK_ERR_BAD_PARAM_VALUE);
216+
ret = tsk_json_binary_metadata_get_blob(
217+
metadata, metadata_length, &json, &json_buffer_length, &blob, NULL);
197218
CU_ASSERT_EQUAL(ret, TSK_ERR_BAD_PARAM_VALUE);
198219
}
199220

c/tskit/core.c

Lines changed: 15 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -143,16 +143,19 @@ tsk_generate_uuid(char *dest, int TSK_UNUSED(flags))
143143

144144
int
145145
tsk_json_binary_metadata_get_blob(const char *metadata, tsk_size_t metadata_length,
146-
const uint8_t **blob, tsk_size_t *blob_length)
146+
const char **json, tsk_size_t *json_length, const uint8_t **blob,
147+
tsk_size_t *blob_length)
147148
{
148149
int ret;
149150
uint8_t version;
150-
uint64_t json_length;
151-
uint64_t binary_length;
151+
uint64_t json_length_u64;
152+
uint64_t binary_length_u64;
152153
const uint8_t *bytes;
153154
const uint8_t *blob_start;
155+
const char *json_start;
154156

155-
if (metadata == NULL || blob == NULL || blob_length == NULL) {
157+
if (metadata == NULL || json == NULL || json_length == NULL || blob == NULL
158+
|| blob_length == NULL) {
156159
ret = tsk_trace_error(TSK_ERR_BAD_PARAM_VALUE);
157160
goto out;
158161
}
@@ -170,16 +173,19 @@ tsk_json_binary_metadata_get_blob(const char *metadata, tsk_size_t metadata_leng
170173
ret = tsk_trace_error(TSK_ERR_FILE_VERSION_TOO_NEW);
171174
goto out;
172175
}
173-
json_length = tsk_load_u64_le(bytes + 5);
174-
binary_length = tsk_load_u64_le(bytes + 13);
176+
json_length_u64 = tsk_load_u64_le(bytes + 5);
177+
binary_length_u64 = tsk_load_u64_le(bytes + 13);
175178
if ((uint64_t) metadata_length
176-
< (uint64_t) TSK_JSON_BINARY_HEADER_SIZE + json_length + binary_length) {
179+
< (uint64_t) TSK_JSON_BINARY_HEADER_SIZE + json_length_u64 + binary_length_u64) {
177180
ret = tsk_trace_error(TSK_ERR_FILE_FORMAT);
178181
goto out;
179182
}
180-
blob_start = bytes + TSK_JSON_BINARY_HEADER_SIZE + json_length;
183+
json_start = (const char *) bytes + TSK_JSON_BINARY_HEADER_SIZE;
184+
blob_start = bytes + TSK_JSON_BINARY_HEADER_SIZE + json_length_u64;
185+
*json = json_start;
186+
*json_length = (tsk_size_t) json_length_u64;
181187
*blob = blob_start;
182-
*blob_length = (tsk_size_t) binary_length;
188+
*blob_length = (tsk_size_t) binary_length_u64;
183189
ret = 0;
184190
out:
185191
return ret;

c/tskit/core.h

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1094,21 +1094,24 @@ int tsk_generate_uuid(char *dest, int flags);
10941094
@rst
10951095
Metadata produced by :py:class:`tskit.metadata.JSONBinaryCodec` consists of a fixed-size
10961096
header followed by canonical JSON bytes and an optional binary payload. This helper
1097-
validates the ``json+binary`` framing, returning a pointer to the binary portion
1098-
without copying.
1097+
validates the ``json+binary`` framing, returning pointers to the embedded JSON and binary
1098+
sections without copying.
10991099
1100-
The output pointer references memory owned by the caller and remains valid only while
1100+
The output pointers reference memory owned by the caller and remain valid only while
11011101
the original metadata buffer is alive.
11021102
@endrst
11031103
11041104
@param[in] metadata Pointer to the encoded metadata bytes.
11051105
@param[in] metadata_length Number of bytes available at ``metadata``.
1106+
@param[out] json On success, set to the start of the JSON bytes.
1107+
@param[out] json_length On success, set to the JSON length in bytes.
11061108
@param[out] blob On success, set to the start of the binary payload.
11071109
@param[out] blob_length On success, set to the payload length in bytes.
11081110
@return 0 on success, or a :ref:`TSK_ERR <c_api_errors>` code on failure.
11091111
*/
11101112
int tsk_json_binary_metadata_get_blob(const char *metadata, tsk_size_t metadata_length,
1111-
const uint8_t **blob, tsk_size_t *blob_length);
1113+
const char **json, tsk_size_t *json_length, const uint8_t **blob,
1114+
tsk_size_t *blob_length);
11121115

11131116
/* TODO most of these can probably be macros so they compile out as no-ops.
11141117
* Lets do the 64 bit tsk_size_t switch first though. */

0 commit comments

Comments
 (0)