diff options
| author | rimio <vasi.vilvoiu@gmail.com> | 2018-03-04 19:42:45 +0200 |
|---|---|---|
| committer | rimio <vasi.vilvoiu@gmail.com> | 2018-03-04 19:42:45 +0200 |
| commit | b91db4fa131fd5bc328d83b6de65ac549d43ffd9 (patch) | |
| tree | ad24c3b607bc3f99527825b16d3b09c89f0655a2 | |
| parent | 4bb2cc10726705e5272fa03e58716fc088bf7faa (diff) | |
Count indefinite arrays; end checking as separate step
| -rw-r--r-- | src/ecbor_decoder.c | 74 |
1 files changed, 43 insertions, 31 deletions
diff --git a/src/ecbor_decoder.c b/src/ecbor_decoder.c index f4a49f3..7ce183f 100644 --- a/src/ecbor_decoder.c +++ b/src/ecbor_decoder.c @@ -590,6 +590,7 @@ ecbor_decode_tree (ecbor_decode_context_t *context, ecbor_item_t **root) LINK_FIRST_NODE, LINK_NODE, CHECK_END_OF_DEFINITE, + CHECK_END, END } state = CONSUME_NODE; uint8_t last_was_stop_code = 0; @@ -636,37 +637,8 @@ ecbor_decode_tree (ecbor_decode_context_t *context, ecbor_item_t **root) context->n_items --; rc = ECBOR_OK; } else if (rc == ECBOR_END_OF_BUFFER) { - /* check for bad end scenatios */ - if (!curr_node) { - /* first node was stop code, bad end */ - rc = ECBOR_ERR_INVALID_END_OF_BUFFER; - goto end; - } - if (curr_node->parent) { - /* we're not top level, bad end */ - rc = ECBOR_ERR_INVALID_END_OF_BUFFER; - goto end; - } - if (ECBOR_IS_TAG (curr_node) && !curr_node->child) { - /* unfinished tag, bad end */ - rc = ECBOR_ERR_INVALID_END_OF_BUFFER; - goto end; - } - if (ECBOR_IS_MAP (curr_node) || ECBOR_IS_ARRAY (curr_node)) { - if (ECBOR_IS_DEFINITE (curr_node) && !curr_node->child - && curr_node->length > 0) { - /* unfinished definite array or map, bad end */ - rc = ECBOR_ERR_INVALID_END_OF_BUFFER; - goto end; - } - if (ECBOR_IS_INDEFINITE (curr_node) && !last_was_stop_code) { - /* unfinished indefinite array or map, bad end */ - rc = ECBOR_ERR_INVALID_END_OF_BUFFER; - goto end; - } - } - /* done! */ - state = END; + state = CHECK_END; + rc = ECBOR_OK; } else if (rc == ECBOR_OK) { state = (curr_node ? LINK_NODE : LINK_FIRST_NODE); } else { @@ -732,6 +704,11 @@ ecbor_decode_tree (ecbor_decode_context_t *context, ecbor_item_t **root) curr_node = new_node; last_was_stop_code = 0; + /* count indefinite arrays and maps */ + if (curr_node->parent && (ECBOR_IS_ARRAY (curr_node->parent) || ECBOR_IS_MAP (curr_node->parent)) && ECBOR_IS_INDEFINITE (curr_node->parent)) { + curr_node->parent->length ++; + } + /* check end of definite arrays and maps */ state = CHECK_END_OF_DEFINITE; } @@ -764,6 +741,41 @@ ecbor_decode_tree (ecbor_decode_context_t *context, ecbor_item_t **root) state = CONSUME_NODE; } break; + + case CHECK_END: + /* check for bad end scenatios */ + if (!curr_node) { + /* first node was stop code, bad end */ + rc = ECBOR_ERR_INVALID_END_OF_BUFFER; + goto end; + } + if (curr_node->parent) { + /* we're not top level, bad end */ + rc = ECBOR_ERR_INVALID_END_OF_BUFFER; + goto end; + } + if (ECBOR_IS_TAG (curr_node) && !curr_node->child) { + /* unfinished tag, bad end */ + rc = ECBOR_ERR_INVALID_END_OF_BUFFER; + goto end; + } + if (ECBOR_IS_MAP (curr_node) || ECBOR_IS_ARRAY (curr_node)) { + if (ECBOR_IS_DEFINITE (curr_node) && !curr_node->child + && curr_node->length > 0) { + /* unfinished definite array or map, bad end */ + rc = ECBOR_ERR_INVALID_END_OF_BUFFER; + goto end; + } + if (ECBOR_IS_INDEFINITE (curr_node) && !last_was_stop_code) { + /* unfinished indefinite array or map, bad end */ + rc = ECBOR_ERR_INVALID_END_OF_BUFFER; + goto end; + } + } + + /* done! */ + state = END; + break; default: rc = ECBOR_ERR_UNKNOWN; |
