summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVasile Vilvoiu <vasi@vilvoiu.ro>2023-06-12 23:14:25 +0300
committerVasile Vilvoiu <vasi@vilvoiu.ro>2023-06-12 23:14:25 +0300
commitfca8388fcad12182bd0406d262c873bbce29fee5 (patch)
treec25608f77cc266f81d2a92321fe9d5c575a26e20
parent7af57877361952d125225b70e34ae8edda20dbe5 (diff)
Correctly set string pointer for non trivial sizes.
Fixes #17.
-rw-r--r--src/libecbor/ecbor_decoder.c31
-rw-r--r--test/files/issues/issue-17-1b.answer1
-rw-r--r--test/files/issues/issue-17-1b.hex1
-rw-r--r--test/files/issues/issue-17-2b.answer1
-rw-r--r--test/files/issues/issue-17-2b.hex1
-rw-r--r--test/files/issues/issue-17-3b.answer1
-rw-r--r--test/files/issues/issue-17-3b.hex1
-rw-r--r--test/files/issues/issue-17-4b.answer1
-rw-r--r--test/files/issues/issue-17-4b.hex1
-rw-r--r--test/files/issues/issue-17-indef.answer2
-rw-r--r--test/files/issues/issue-17-indef.hex1
-rwxr-xr-xtest/runtests.sh18
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 "========================================================================"