Skip to content

Commit f4b813c

Browse files
authored
Fix the item size of value encoded only in tag to be 0 (#6)
1 parent 15e4d71 commit f4b813c

File tree

4 files changed

+39
-36
lines changed

4 files changed

+39
-36
lines changed

include/cbor/cbor.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ extern "C" {
88
#include <stddef.h>
99
#include <stdint.h>
1010

11-
#if !defined(CBOR_RECURSION_DEPTH)
11+
#if !defined(CBOR_RECURSION_MAX_LEVEL)
1212
#define CBOR_RECURSION_MAX_LEVEL 4
1313
#endif
1414

src/decoder.c

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,8 @@ static cbor_error_t decode_negative_integer(cbor_item_t const *item,
7575
}
7676

7777
uint64_t val = 0;
78-
cbor_copy_be((uint8_t *)&val, buf, item->size);
78+
size_t len = item->size? item->size : 1;
79+
cbor_copy_be((uint8_t *)&val, buf, len);
7980

8081
val = ~val;
8182

@@ -86,7 +87,7 @@ static cbor_error_t decode_negative_integer(cbor_item_t const *item,
8687
buf[i] = 0xff;
8788
}
8889

89-
cbor_copy_be(buf, (uint8_t *)&val, item->size);
90+
cbor_copy_be(buf, (uint8_t *)&val, len);
9091

9192
return CBOR_SUCCESS;
9293
}
@@ -153,7 +154,7 @@ cbor_error_t cbor_decode(cbor_reader_t const *reader, cbor_item_t const *item,
153154
if (is_break(item)) {
154155
return CBOR_BREAK;
155156
}
156-
if (item->size > bufsize) {
157+
if (item->size > bufsize || bufsize == 0 || buf == NULL) {
157158
return CBOR_OVERRUN;
158159
}
159160

src/parser.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -134,7 +134,7 @@ static cbor_error_t do_integer(struct parser_context *ctx)
134134

135135
cbor_item_t *item = &ctx->items[ctx->itemidx];
136136
item->type = CBOR_ITEM_INTEGER;
137-
item->size = (size_t)(ctx->following_bytes + !ctx->following_bytes);
137+
item->size = (size_t)ctx->following_bytes;
138138
item->offset = ctx->reader->msgidx;
139139

140140
ctx->reader->msgidx += (size_t)(ctx->following_bytes + 1);
@@ -198,7 +198,7 @@ static cbor_error_t do_float_and_other(struct parser_context *ctx)
198198
cbor_error_t err = CBOR_SUCCESS;
199199

200200
item->type = CBOR_ITEM_FLOAT;
201-
item->size = (size_t)ctx->following_bytes + !ctx->following_bytes;
201+
item->size = (size_t)ctx->following_bytes;
202202
item->offset = ctx->reader->msgidx;
203203

204204
if (ctx->following_bytes == (uint8_t)CBOR_INDEFINITE_VALUE) {

tests/src/decoder_test.cpp

Lines changed: 32 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ TEST(Decoder, ShouldDecodeUnsignedInteger_WhenEncodedGiven) {
6565
cbor_reader_init(&reader, &m[i], sizeof(m[i]));
6666
LONGS_EQUAL(CBOR_SUCCESS, cbor_parse(&reader, &item, 1, &n));
6767
LONGS_EQUAL(1, n);
68-
LONGS_EQUAL(1, item.size);
68+
LONGS_EQUAL(0, item.size);
6969
LONGS_EQUAL(0, item.offset);
7070
uint8_t v;
7171
LONGS_EQUAL(CBOR_SUCCESS,
@@ -241,7 +241,7 @@ TEST(Decoder, ShouldDecodeTextString_WhenWrappedInArray) {
241241
LONGS_EQUAL(4, items[0].size); // array
242242
LONGS_EQUAL(1, items[1].size); // text
243243
LONGS_EQUAL(1, items[2].size); // text
244-
LONGS_EQUAL(1, items[3].size); // unsigned
244+
LONGS_EQUAL(0, items[3].size); // unsigned
245245
LONGS_EQUAL(4, items[4].size); // text
246246

247247
LONGS_EQUAL(CBOR_SUCCESS, cbor_decode(&reader, &items[0], buf, sizeof(buf)));
@@ -289,7 +289,7 @@ TEST(Decoder, ShouldDecodeArray_WhenSingleLevelWithDiffentTypeValueGiven) {
289289
LONGS_EQUAL(4, n);
290290

291291
mock().expectOneCall("f_array").withParameter("size", 3);
292-
mock().expectNCalls(2, "f_integer").withParameter("size", 1);
292+
mock().expectNCalls(2, "f_integer").withParameter("size", 0);
293293
mock().expectOneCall("f_string").withParameter("size", 3);
294294

295295
for (size_t i = 0; i < n; i++) {
@@ -305,19 +305,19 @@ TEST(Decoder, ShouldDecodeArray_WhenMultiLevelArrayGiven) {
305305
LONGS_EQUAL(8, n);
306306

307307
mock().expectOneCall("f_array").withParameter("size", 3);
308-
mock().expectOneCall("f_integer").withParameter("size", 1);
308+
mock().expectOneCall("f_integer").withParameter("size", 0);
309309
mock().expectOneCall("f_array").withParameter("size", 2);
310-
mock().expectNCalls(2, "f_integer").withParameter("size", 1);
310+
mock().expectNCalls(2, "f_integer").withParameter("size", 0);
311311
mock().expectOneCall("f_array").withParameter("size", 2);
312-
mock().expectNCalls(2, "f_integer").withParameter("size", 1);
312+
mock().expectNCalls(2, "f_integer").withParameter("size", 0);
313313

314314
for (size_t i = 0; i < n; i++) {
315315
check_item_type[items[i].type](items[i].size);
316316
}
317317
}
318318
TEST(Decoder, ShouldDecodeArray_WhenOneByteLengthGiven) {
319319
// [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25]
320-
uint8_t m[] = { 0x98,0x19,0x01,0x02,0x03,0x04,0x05,0x06, 0x07,0x08,0x09,
320+
uint8_t m[] = { 0x98,0x19,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,
321321
0x0a,0x0b,0x0c,0x0d,0x0e,0x0f,0x10,0x11,0x12,0x13,0x14,0x15,
322322
0x16,0x17,0x18,0x18,0x18,0x19 };
323323
size_t n;
@@ -327,7 +327,8 @@ TEST(Decoder, ShouldDecodeArray_WhenOneByteLengthGiven) {
327327
LONGS_EQUAL(26, n);
328328

329329
mock().expectOneCall("f_array").withParameter("size", 25);
330-
mock().expectNCalls(25, "f_integer").withParameter("size", 1);
330+
mock().expectNCalls(23, "f_integer").withParameter("size", 0);
331+
mock().expectNCalls(2, "f_integer").withParameter("size", 1);
331332

332333
for (size_t i = 0; i < n; i++) {
333334
check_item_type[items[i].type](items[i].size);
@@ -343,7 +344,7 @@ TEST(Decoder, ShouldDecodeMap_WhenSingleLevelArrayGiven) {
343344
LONGS_EQUAL(5, n);
344345

345346
mock().expectOneCall("f_map").withParameter("size", 2);
346-
mock().expectNCalls(4, "f_integer").withParameter("size", 1);
347+
mock().expectNCalls(4, "f_integer").withParameter("size", 0);
347348

348349
for (size_t i = 0; i < n; i++) {
349350
check_item_type[items[i].type](items[i].size);
@@ -385,10 +386,10 @@ TEST(Decoder, ShouldDecodeMap_WhenArrayValueGiven) {
385386

386387
mock().expectOneCall("f_map").withParameter("size", 2);
387388
mock().expectOneCall("f_string").withParameter("size", 1);
388-
mock().expectOneCall("f_integer").withParameter("size", 1);
389+
mock().expectOneCall("f_integer").withParameter("size", 0);
389390
mock().expectOneCall("f_string").withParameter("size", 1);
390391
mock().expectOneCall("f_array").withParameter("size", 2);
391-
mock().expectNCalls(2, "f_integer").withParameter("size", 1);
392+
mock().expectNCalls(2, "f_integer").withParameter("size", 0);
392393

393394
for (size_t i = 0; i < n; i++) {
394395
check_item_type[items[i].type](items[i].size);
@@ -505,11 +506,11 @@ TEST(Decoder, ShouldDecodeArray_WhenMultiLevelIndefiniteArrarGiven) {
505506
LONGS_EQUAL(10, n);
506507

507508
mock().expectOneCall("f_array").withParameter("size", (size_t)-1);
508-
mock().expectOneCall("f_integer").withParameter("size", 1);
509+
mock().expectOneCall("f_integer").withParameter("size", 0);
509510
mock().expectOneCall("f_array").withParameter("size", 2);
510-
mock().expectNCalls(2, "f_integer").withParameter("size", 1);
511+
mock().expectNCalls(2, "f_integer").withParameter("size", 0);
511512
mock().expectOneCall("f_array").withParameter("size", (size_t)-1);
512-
mock().expectNCalls(2, "f_integer").withParameter("size", 1);
513+
mock().expectNCalls(2, "f_integer").withParameter("size", 0);
513514
mock().expectOneCall("f_float").withParameter("size", 0xff);
514515
mock().expectOneCall("f_float").withParameter("size", 0xff);
515516

@@ -527,11 +528,11 @@ TEST(Decoder, ShouldDecodeArray_WhenMultiLevelIndefiniteArrarGiven2) {
527528
LONGS_EQUAL(9, n);
528529

529530
mock().expectOneCall("f_array").withParameter("size", (size_t)-1);
530-
mock().expectOneCall("f_integer").withParameter("size", 1);
531+
mock().expectOneCall("f_integer").withParameter("size", 0);
531532
mock().expectOneCall("f_array").withParameter("size", 2);
532-
mock().expectNCalls(2, "f_integer").withParameter("size", 1);
533+
mock().expectNCalls(2, "f_integer").withParameter("size", 0);
533534
mock().expectOneCall("f_array").withParameter("size", 2);
534-
mock().expectNCalls(2, "f_integer").withParameter("size", 1);
535+
mock().expectNCalls(2, "f_integer").withParameter("size", 0);
535536
mock().expectOneCall("f_float").withParameter("size", 0xff);
536537

537538
for (size_t i = 0; i < n; i++) {
@@ -548,11 +549,11 @@ TEST(Decoder, ShouldDecodeArray_WhenMultiLevelIndefiniteArrarGiven3) {
548549
LONGS_EQUAL(9, n);
549550

550551
mock().expectOneCall("f_array").withParameter("size", 3);
551-
mock().expectOneCall("f_integer").withParameter("size", 1);
552+
mock().expectOneCall("f_integer").withParameter("size", 0);
552553
mock().expectOneCall("f_array").withParameter("size", 2);
553-
mock().expectNCalls(2, "f_integer").withParameter("size", 1);
554+
mock().expectNCalls(2, "f_integer").withParameter("size", 0);
554555
mock().expectOneCall("f_array").withParameter("size", (size_t)-1);
555-
mock().expectNCalls(2, "f_integer").withParameter("size", 1);
556+
mock().expectNCalls(2, "f_integer").withParameter("size", 0);
556557
mock().expectOneCall("f_float").withParameter("size", 0xff);
557558

558559
for (size_t i = 0; i < n; i++) {
@@ -569,12 +570,12 @@ TEST(Decoder, ShouldDecodeArray_WhenMultiLevelIndefiniteArrarGiven4) {
569570
LONGS_EQUAL(9, n);
570571

571572
mock().expectOneCall("f_array").withParameter("size", 3);
572-
mock().expectOneCall("f_integer").withParameter("size", 1);
573+
mock().expectOneCall("f_integer").withParameter("size", 0);
573574
mock().expectOneCall("f_array").withParameter("size", (size_t)-1);
574-
mock().expectNCalls(2, "f_integer").withParameter("size", 1);
575+
mock().expectNCalls(2, "f_integer").withParameter("size", 0);
575576
mock().expectOneCall("f_float").withParameter("size", 0xff);
576577
mock().expectOneCall("f_array").withParameter("size", 2);
577-
mock().expectNCalls(2, "f_integer").withParameter("size", 1);
578+
mock().expectNCalls(2, "f_integer").withParameter("size", 0);
578579

579580
for (size_t i = 0; i < n; i++) {
580581
check_item_type[items[i].type](items[i].size);
@@ -592,7 +593,8 @@ TEST(Decoder, ShouldDecodeArray_WhenInfiniteLengthGiven) {
592593
LONGS_EQUAL(27, n);
593594

594595
mock().expectOneCall("f_array").withParameter("size", (size_t)-1);
595-
mock().expectNCalls(25, "f_integer").withParameter("size", 1);
596+
mock().expectNCalls(23, "f_integer").withParameter("size", 0);
597+
mock().expectNCalls(2, "f_integer").withParameter("size", 1);
596598
mock().expectOneCall("f_float").withParameter("size", 0xff);
597599

598600
for (size_t i = 0; i < n; i++) {
@@ -610,10 +612,10 @@ TEST(Decoder, ShouldDecodeMap_WhenMultiInfiniteLengthGiven) {
610612

611613
mock().expectOneCall("f_map").withParameter("size", (size_t)-1);
612614
mock().expectOneCall("f_string").withParameter("size", 1);
613-
mock().expectOneCall("f_integer").withParameter("size", 1);
615+
mock().expectOneCall("f_integer").withParameter("size", 0);
614616
mock().expectOneCall("f_string").withParameter("size", 1);
615617
mock().expectOneCall("f_array").withParameter("size", (size_t)-1);
616-
mock().expectNCalls(2, "f_integer").withParameter("size", 1);
618+
mock().expectNCalls(2, "f_integer").withParameter("size", 0);
617619
mock().expectOneCall("f_float").withParameter("size", 0xff);
618620
mock().expectOneCall("f_float").withParameter("size", 0xff);
619621

@@ -742,7 +744,7 @@ TEST(Decoder, ShouldDecodeFalse) {
742744
LONGS_EQUAL(CBOR_SUCCESS, cbor_parse(&reader, items, sizeof(items)/sizeof(items[0]), &n));
743745
LONGS_EQUAL(1, n);
744746

745-
mock().expectOneCall("f_simple").withParameter("size", 1);
747+
mock().expectOneCall("f_simple").withParameter("size", 0);
746748

747749
for (size_t i = 0; i < n; i++) {
748750
check_item_type[items[i].type](items[i].size);
@@ -760,7 +762,7 @@ TEST(Decoder, ShouldDecodeTrue) {
760762
LONGS_EQUAL(CBOR_SUCCESS, cbor_parse(&reader, items, sizeof(items)/sizeof(items[0]), &n));
761763
LONGS_EQUAL(1, n);
762764

763-
mock().expectOneCall("f_simple").withParameter("size", 1);
765+
mock().expectOneCall("f_simple").withParameter("size", 0);
764766

765767
for (size_t i = 0; i < n; i++) {
766768
check_item_type[items[i].type](items[i].size);
@@ -778,7 +780,7 @@ TEST(Decoder, ShouldDecodeNull) {
778780
LONGS_EQUAL(CBOR_SUCCESS, cbor_parse(&reader, items, sizeof(items)/sizeof(items[0]), &n));
779781
LONGS_EQUAL(1, n);
780782

781-
mock().expectOneCall("f_simple").withParameter("size", 1);
783+
mock().expectOneCall("f_simple").withParameter("size", 0);
782784

783785
for (size_t i = 0; i < n; i++) {
784786
check_item_type[items[i].type](items[i].size);
@@ -796,7 +798,7 @@ TEST(Decoder, ShouldDecodeSimpleValue) {
796798
LONGS_EQUAL(CBOR_SUCCESS, cbor_parse(&reader, items, sizeof(items)/sizeof(items[0]), &n));
797799
LONGS_EQUAL(1, n);
798800

799-
mock().expectOneCall("f_simple").withParameter("size", 1);
801+
mock().expectOneCall("f_simple").withParameter("size", 0);
800802

801803
for (size_t i = 0; i < n; i++) {
802804
check_item_type[items[i].type](items[i].size);

0 commit comments

Comments
 (0)