fix: cbor decode error when keys have sub strings
Project: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/commit/551c0a66 Tree: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/tree/551c0a66 Diff: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/diff/551c0a66 Branch: refs/heads/bluetooth5 Commit: 551c0a66ed86e01ea745dac839e52056094fc9b6 Parents: eb4f289 Author: wesley <wes...@wolinke.com> Authored: Fri Apr 28 13:09:07 2017 +0800 Committer: wesley <wes...@wolinke.com> Committed: Fri Apr 28 13:09:07 2017 +0800 ---------------------------------------------------------------------- encoding/cborattr/src/cborattr.c | 3 +- encoding/cborattr/test/src/test_cborattr.c | 1 + encoding/cborattr/test/src/test_cborattr.h | 1 + .../testcases/cborattr_decode_substring_key.c | 111 +++++++++++++++++++ 4 files changed, 115 insertions(+), 1 deletion(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/551c0a66/encoding/cborattr/src/cborattr.c ---------------------------------------------------------------------- diff --git a/encoding/cborattr/src/cborattr.c b/encoding/cborattr/src/cborattr.c index d2e731a..6f6912e 100644 --- a/encoding/cborattr/src/cborattr.c +++ b/encoding/cborattr/src/cborattr.c @@ -219,7 +219,8 @@ cbor_internal_read_object(CborValue *root_value, if (cursor->attribute == CBORATTR_ATTR_UNNAMED && attrbuf[0] == '\0') { best_match = cursor; - } else if (!memcmp(cursor->attribute, attrbuf, len)) { + } else if (strlen(cursor->attribute) == len && + !memcmp(cursor->attribute, attrbuf, len)) { break; } } http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/551c0a66/encoding/cborattr/test/src/test_cborattr.c ---------------------------------------------------------------------- diff --git a/encoding/cborattr/test/src/test_cborattr.c b/encoding/cborattr/test/src/test_cborattr.c index 8125660..15a892a 100644 --- a/encoding/cborattr/test/src/test_cborattr.c +++ b/encoding/cborattr/test/src/test_cborattr.c @@ -32,6 +32,7 @@ TEST_SUITE(test_cborattr_suite) test_cborattr_decode_string_array(); test_cborattr_decode_object_array(); test_cborattr_decode_unnamed_array(); + test_cborattr_decode_substring_key(); } #if MYNEWT_VAL(SELFTEST) http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/551c0a66/encoding/cborattr/test/src/test_cborattr.h ---------------------------------------------------------------------- diff --git a/encoding/cborattr/test/src/test_cborattr.h b/encoding/cborattr/test/src/test_cborattr.h index 1a5757b..2ffe515 100644 --- a/encoding/cborattr/test/src/test_cborattr.h +++ b/encoding/cborattr/test/src/test_cborattr.h @@ -47,6 +47,7 @@ TEST_CASE_DECL(test_cborattr_decode_bool_array); TEST_CASE_DECL(test_cborattr_decode_string_array); TEST_CASE_DECL(test_cborattr_decode_object_array); TEST_CASE_DECL(test_cborattr_decode_unnamed_array); +TEST_CASE_DECL(test_cborattr_decode_substring_key); #ifdef __cplusplus http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/551c0a66/encoding/cborattr/test/src/testcases/cborattr_decode_substring_key.c ---------------------------------------------------------------------- diff --git a/encoding/cborattr/test/src/testcases/cborattr_decode_substring_key.c b/encoding/cborattr/test/src/testcases/cborattr_decode_substring_key.c new file mode 100644 index 0000000..6eee774 --- /dev/null +++ b/encoding/cborattr/test/src/testcases/cborattr_decode_substring_key.c @@ -0,0 +1,111 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +#include "test_cborattr.h" + +/* + * Where we collect cbor data. + */ +static uint8_t test_cbor_buf[1024]; +static int test_cbor_len; + +/* + * CBOR encoder data structures. + */ +static int test_cbor_wr(struct cbor_encoder_writer *, const char *, int); +static CborEncoder test_encoder; +static struct cbor_encoder_writer test_writer = { + .write = test_cbor_wr +}; + +static int +test_cbor_wr(struct cbor_encoder_writer *cew, const char *data, int len) +{ + memcpy(test_cbor_buf + test_cbor_len, data, len); + test_cbor_len += len; + + assert(test_cbor_len < sizeof(test_cbor_buf)); + return 0; +} + +static void +test_encode_substring_key(void) +{ + CborEncoder data; + + cbor_encoder_init(&test_encoder, &test_writer, 0); + + /* + * { "a": "A", "aa": "AA", "aaa" : "AAA" } + */ + cbor_encoder_create_map(&test_encoder, &data, CborIndefiniteLength); + + cbor_encode_text_stringz(&data, "a"); + cbor_encode_text_stringz(&data, "A"); + cbor_encode_text_stringz(&data, "aa"); + cbor_encode_text_stringz(&data, "AA"); + cbor_encode_text_stringz(&data, "aaa"); + cbor_encode_text_stringz(&data, "AAA"); + + cbor_encoder_close_container(&test_encoder, &data); +} + +/* + * substring key + */ +TEST_CASE(test_cborattr_decode_substring_key) +{ + int rc; + char test_str_1a[4] = { '\0' }; + char test_str_2a[4] = { '\0' }; + char test_str_3a[4] = { '\0' }; + struct cbor_attr_t test_attrs[] = { + [0] = { + .attribute = "aaa", + .type = CborAttrTextStringType, + .addr.string = test_str_3a, + .len = sizeof(test_str_3a), + .nodefault = true + }, + [1] = { + .attribute = "aa", + .type = CborAttrTextStringType, + .addr.string = test_str_2a, + .len = sizeof(test_str_2a), + .nodefault = true + }, + [2] = { + .attribute = "a", + .type = CborAttrTextStringType, + .addr.string = test_str_1a, + .len = sizeof(test_str_1a), + .nodefault = true + }, + [3] = { + .attribute = NULL + } + }; + + test_encode_substring_key(); + + rc = cbor_read_flat_attrs(test_cbor_buf, test_cbor_len, test_attrs); + TEST_ASSERT(rc == 0); + TEST_ASSERT(!strcmp(test_str_1a, "A")); + TEST_ASSERT(!strcmp(test_str_2a, "AA")); + TEST_ASSERT(!strcmp(test_str_3a, "AAA")); +}