Fix parsing/printing errors on empty maps & arrays

This commit is contained in:
Aaron Cook 2025-09-21 20:01:16 -05:00
commit 6ffaa66158

View file

@ -130,6 +130,11 @@ empack_parse(empack_t *empack, const void *msgpack, uint32_t len)
{ {
empack_array_t *parr = &cur->val.array; 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); parr->objects = empack_allocate(empack, sizeof(empack_obj_t) * parr->object_count);
if (parr->objects == NULL) { if (parr->objects == NULL) {
ret = EMPACK_STATUS_NOMEM; 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; 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); pmap->pairs = empack_allocate(empack, sizeof(empack_map_t) * pmap->pair_count);
if (pmap->pairs == NULL) { if (pmap->pairs == NULL) {
ret = EMPACK_STATUS_NOMEM; ret = EMPACK_STATUS_NOMEM;
@ -523,18 +533,28 @@ empack_print(empack_t *empack,
case EMPACK_TYPE_MAP16: case EMPACK_TYPE_MAP16:
case EMPACK_TYPE_MAP32: case EMPACK_TYPE_MAP32:
EMPACK_PRINT("{", 1); EMPACK_PRINT("{", 1);
if (cur->val.map.pair_count > 0) {
EMPACK_PRINT_NEWLINE(); EMPACK_PRINT_NEWLINE();
cur->val.map.pairs_parsed = 0; cur->val.map.pairs_parsed = 0;
indent_depth++; indent_depth++;
} else {
EMPACK_PRINT("}", 1);
}
break; break;
case EMPACK_TYPE_FIXARRAY: case EMPACK_TYPE_FIXARRAY:
case EMPACK_TYPE_ARRAY16: case EMPACK_TYPE_ARRAY16:
case EMPACK_TYPE_ARRAY32: case EMPACK_TYPE_ARRAY32:
EMPACK_PRINT("[", 1); EMPACK_PRINT("[", 1);
if (cur->val.array.object_count > 0) {
EMPACK_PRINT_NEWLINE(); EMPACK_PRINT_NEWLINE();
cur->val.array.objects_parsed = 0; cur->val.array.objects_parsed = 0;
indent_depth++; indent_depth++;
} else {
EMPACK_PRINT("]", 1);
}
break; break;
case EMPACK_TYPE_FIXSTR: case EMPACK_TYPE_FIXSTR: