summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorrimio <vasi.vilvoiu@gmail.com>2018-03-04 19:42:45 +0200
committerrimio <vasi.vilvoiu@gmail.com>2018-03-04 19:42:45 +0200
commitb91db4fa131fd5bc328d83b6de65ac549d43ffd9 (patch)
treead24c3b607bc3f99527825b16d3b09c89f0655a2
parent4bb2cc10726705e5272fa03e58716fc088bf7faa (diff)
Count indefinite arrays; end checking as separate step
-rw-r--r--src/ecbor_decoder.c74
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;