From 6ffaa6615858a383994dadeb2ba237dd66669527 Mon Sep 17 00:00:00 2001 From: Aaron Cook Date: Sun, 21 Sep 2025 20:01:16 -0500 Subject: [PATCH] Fix parsing/printing errors on empty maps & arrays --- src/empack.c | 32 ++++++++++++++++++++++++++------ 1 file changed, 26 insertions(+), 6 deletions(-) diff --git a/src/empack.c b/src/empack.c index 2e6dd6d..24b8dd8 100644 --- a/src/empack.c +++ b/src/empack.c @@ -130,6 +130,11 @@ empack_parse(empack_t *empack, const void *msgpack, uint32_t len) { empack_array_t *parr = &cur->val.array; + if (parr->object_count == 0) { + /* nothing to do on an empty array */ + break; + } + parr->objects = empack_allocate(empack, sizeof(empack_obj_t) * parr->object_count); if (parr->objects == NULL) { ret = EMPACK_STATUS_NOMEM; @@ -147,6 +152,11 @@ empack_parse(empack_t *empack, const void *msgpack, uint32_t len) { empack_map_t *pmap = &cur->val.map; + if (pmap->pair_count == 0) { + /* nothing to do on an empty map */ + break; + } + pmap->pairs = empack_allocate(empack, sizeof(empack_map_t) * pmap->pair_count); if (pmap->pairs == NULL) { ret = EMPACK_STATUS_NOMEM; @@ -523,18 +533,28 @@ empack_print(empack_t *empack, case EMPACK_TYPE_MAP16: case EMPACK_TYPE_MAP32: EMPACK_PRINT("{", 1); - EMPACK_PRINT_NEWLINE(); - cur->val.map.pairs_parsed = 0; - indent_depth++; + + if (cur->val.map.pair_count > 0) { + EMPACK_PRINT_NEWLINE(); + cur->val.map.pairs_parsed = 0; + indent_depth++; + } else { + EMPACK_PRINT("}", 1); + } break; case EMPACK_TYPE_FIXARRAY: case EMPACK_TYPE_ARRAY16: case EMPACK_TYPE_ARRAY32: EMPACK_PRINT("[", 1); - EMPACK_PRINT_NEWLINE(); - cur->val.array.objects_parsed = 0; - indent_depth++; + + if (cur->val.array.object_count > 0) { + EMPACK_PRINT_NEWLINE(); + cur->val.array.objects_parsed = 0; + indent_depth++; + } else { + EMPACK_PRINT("]", 1); + } break; case EMPACK_TYPE_FIXSTR: