diff options
| -rw-r--r-- | src/libecbor/ecbor_decoder.c | 31 | ||||
| -rw-r--r-- | test/files/issues/issue-17-1b.answer | 1 | ||||
| -rw-r--r-- | test/files/issues/issue-17-1b.hex | 1 | ||||
| -rw-r--r-- | test/files/issues/issue-17-2b.answer | 1 | ||||
| -rw-r--r-- | test/files/issues/issue-17-2b.hex | 1 | ||||
| -rw-r--r-- | test/files/issues/issue-17-3b.answer | 1 | ||||
| -rw-r--r-- | test/files/issues/issue-17-3b.hex | 1 | ||||
| -rw-r--r-- | test/files/issues/issue-17-4b.answer | 1 | ||||
| -rw-r--r-- | test/files/issues/issue-17-4b.hex | 1 | ||||
| -rw-r--r-- | test/files/issues/issue-17-indef.answer | 2 | ||||
| -rw-r--r-- | test/files/issues/issue-17-indef.hex | 1 | ||||
| -rwxr-xr-x | test/runtests.sh | 18 |
12 files changed, 43 insertions, 17 deletions
diff --git a/src/libecbor/ecbor_decoder.c b/src/libecbor/ecbor_decoder.c index 5bb3eac..47f2571 100644 --- a/src/libecbor/ecbor_decoder.c +++ b/src/libecbor/ecbor_decoder.c @@ -289,8 +289,6 @@ ecbor_decode_next_internal (ecbor_decode_context_t *context, */ case ECBOR_TYPE_BSTR: case ECBOR_TYPE_STR: - /* keep buffer pointer from current pointer */ - item->value.string.str = context->in_position; item->value.string.n_chunks = 0; /* discriminate between definite and indefinite strings; we do not treat @@ -317,19 +315,17 @@ ecbor_decode_next_internal (ecbor_decode_context_t *context, /* read next chunk */ rc = ecbor_decode_next_internal (context, &chunk, true, item->type); - if (rc != ECBOR_OK) { - if (rc == ECBOR_END_OF_INDEFINITE) { - /* stop code found, break from loop */ - item->size += chunk.size; /* meter stop code as well */ - break; - } else if (rc == ECBOR_END_OF_BUFFER) { - /* treat a valid end of buffer as invalid since we did not yet - find the stop code */ - return ECBOR_ERR_INVALID_END_OF_BUFFER; - } else if (rc != ECBOR_OK) { - /* other error */ - return rc; - } + if (rc == ECBOR_END_OF_INDEFINITE) { + /* stop code found, break from loop */ + item->size += chunk.size; /* meter stop code as well */ + break; + } else if (rc == ECBOR_END_OF_BUFFER) { + /* treat a valid end of buffer as invalid since we did not yet + find the stop code */ + return ECBOR_ERR_INVALID_END_OF_BUFFER; + } else if (rc != ECBOR_OK) { + /* other error */ + return rc; } /* add chunk size and length to item */ @@ -345,6 +341,9 @@ ecbor_decode_next_internal (ecbor_decode_context_t *context, if (rc != ECBOR_OK) { return rc; } + + /* keep first position in string */ + item->value.string.str = context->in_position; /* if sizeof(size_t) < sizeof(uint64_t), and payload is >4GB, we're fucked */ item->length = len; @@ -790,4 +789,4 @@ end: } return rc; -}
\ No newline at end of file +} diff --git a/test/files/issues/issue-17-1b.answer b/test/files/issues/issue-17-1b.answer new file mode 100644 index 0000000..5b87b41 --- /dev/null +++ b/test/files/issues/issue-17-1b.answer @@ -0,0 +1 @@ +[STR] len 56 value 'Lorem ipsum dolor sit amet, consectetur adipiscing elit.' diff --git a/test/files/issues/issue-17-1b.hex b/test/files/issues/issue-17-1b.hex new file mode 100644 index 0000000..9a3e578 --- /dev/null +++ b/test/files/issues/issue-17-1b.hex @@ -0,0 +1 @@ +78384c6f72656d20697073756d20646f6c6f722073697420616d65742c20636f6e73656374657475722061646970697363696e6720656c69742e diff --git a/test/files/issues/issue-17-2b.answer b/test/files/issues/issue-17-2b.answer new file mode 100644 index 0000000..5b87b41 --- /dev/null +++ b/test/files/issues/issue-17-2b.answer @@ -0,0 +1 @@ +[STR] len 56 value 'Lorem ipsum dolor sit amet, consectetur adipiscing elit.' diff --git a/test/files/issues/issue-17-2b.hex b/test/files/issues/issue-17-2b.hex new file mode 100644 index 0000000..b542f5c --- /dev/null +++ b/test/files/issues/issue-17-2b.hex @@ -0,0 +1 @@ +7900384c6f72656d20697073756d20646f6c6f722073697420616d65742c20636f6e73656374657475722061646970697363696e6720656c69742e diff --git a/test/files/issues/issue-17-3b.answer b/test/files/issues/issue-17-3b.answer new file mode 100644 index 0000000..5b87b41 --- /dev/null +++ b/test/files/issues/issue-17-3b.answer @@ -0,0 +1 @@ +[STR] len 56 value 'Lorem ipsum dolor sit amet, consectetur adipiscing elit.' diff --git a/test/files/issues/issue-17-3b.hex b/test/files/issues/issue-17-3b.hex new file mode 100644 index 0000000..bb2e4e7 --- /dev/null +++ b/test/files/issues/issue-17-3b.hex @@ -0,0 +1 @@ +7a000000384c6f72656d20697073756d20646f6c6f722073697420616d65742c20636f6e73656374657475722061646970697363696e6720656c69742e diff --git a/test/files/issues/issue-17-4b.answer b/test/files/issues/issue-17-4b.answer new file mode 100644 index 0000000..5b87b41 --- /dev/null +++ b/test/files/issues/issue-17-4b.answer @@ -0,0 +1 @@ +[STR] len 56 value 'Lorem ipsum dolor sit amet, consectetur adipiscing elit.' diff --git a/test/files/issues/issue-17-4b.hex b/test/files/issues/issue-17-4b.hex new file mode 100644 index 0000000..783d7f0 --- /dev/null +++ b/test/files/issues/issue-17-4b.hex @@ -0,0 +1 @@ +7b00000000000000384c6f72656d20697073756d20646f6c6f722073697420616d65742c20636f6e73656374657475722061646970697363696e6720656c69742e diff --git a/test/files/issues/issue-17-indef.answer b/test/files/issues/issue-17-indef.answer new file mode 100644 index 0000000..a84e93e --- /dev/null +++ b/test/files/issues/issue-17-indef.answer @@ -0,0 +1,2 @@ +[STR] len 56 (indefinite) + [STR] len 56 value 'Lorem ipsum dolor sit amet, consectetur adipiscing elit.' diff --git a/test/files/issues/issue-17-indef.hex b/test/files/issues/issue-17-indef.hex new file mode 100644 index 0000000..3beb390 --- /dev/null +++ b/test/files/issues/issue-17-indef.hex @@ -0,0 +1 @@ +7f78384c6f72656d20697073756d20646f6c6f722073697420616d65742c20636f6e73656374657475722061646970697363696e6720656c69742eff diff --git a/test/runtests.sh b/test/runtests.sh index fe6b39d..600eee4 100755 --- a/test/runtests.sh +++ b/test/runtests.sh @@ -35,6 +35,7 @@ run_test() { machine_indented=$(printf '%-67s' "$test_name") machine_indented=${machine_indented// /.} printf "%s %s\n" "$machine_indented" "$status" + diff $answer_file $result_file done } @@ -53,6 +54,21 @@ echo "Passed / Failed: ${pass}/${fail}" total_pass=$(($total_pass + $pass)) total_fail=$(($total_fail + $fail)) +# Test cases from issues +pass=0 +fail=0 + +echo "" +echo "============================= FROM ISSUES ==============================" +for f in files/issues/*.bin; do + run_test $f +done +echo "========================================================================" +echo "Passed / Failed: ${pass}/${fail}" + +total_pass=$(($total_pass + $pass)) +total_fail=$(($total_fail + $fail)) + # Error cases tests pass=0 fail=0 @@ -90,4 +106,4 @@ echo "" echo "============================== FINAL REPORT ============================" echo "Total tests passed: $total_pass" echo "Total tests failed: $total_fail" -echo "========================================================================"
\ No newline at end of file +echo "========================================================================" |
