From a9c24745348a822b5394dcb4ac6adf7766ad0d20 Mon Sep 17 00:00:00 2001 From: Steve Karg Date: Fri, 30 Jun 2023 15:39:15 -0500 Subject: [PATCH] Fix BACnetARRAY encoder for index=ALL (#442) Co-authored-by: Steve Karg --- src/bacnet/bacdcode.c | 2 +- test/bacnet/bacdcode/src/main.c | 21 +++++++++++++++++++++ 2 files changed, 22 insertions(+), 1 deletion(-) diff --git a/src/bacnet/bacdcode.c b/src/bacnet/bacdcode.c index 30fa087a..a6a0682f 100644 --- a/src/bacnet/bacdcode.c +++ b/src/bacnet/bacdcode.c @@ -3129,7 +3129,7 @@ int bacnet_array_encode(uint32_t object_instance, /* encoded size is larger than APDU size */ apdu_len = BACNET_STATUS_ABORT; } else { - for (index = 1; index < array_size; index++) { + for (index = 0; index < array_size; index++) { len = encoder(object_instance, index, apdu); if (apdu) { apdu += len; diff --git a/test/bacnet/bacdcode/src/main.c b/test/bacnet/bacdcode/src/main.c index 0020b483..14dc2877 100644 --- a/test/bacnet/bacdcode/src/main.c +++ b/test/bacnet/bacdcode/src/main.c @@ -1340,6 +1340,11 @@ static void test_bacnet_array_encode(void) zassert_equal(tag_number, BACNET_APPLICATION_TAG_UNSIGNED_INT, NULL); len = decode_unsigned(&apdu[len], len_value, &decoded_value); zassert_equal(decoded_value, array_size, NULL); + /* element zero - APDU too small */ + apdu_len = bacnet_array_encode(object_instance, array_index, + bacnet_array_property_element_encode, + array_size, apdu, 1); + zassert_true(apdu_len == BACNET_STATUS_ABORT, NULL); /* element 1 returns the first element */ array_index = 1; apdu_len = bacnet_array_encode(object_instance, array_index, @@ -1349,12 +1354,28 @@ static void test_bacnet_array_encode(void) len = decode_tag_number_and_value(apdu, &tag_number, &len_value); zassert_true(len > 0, NULL); zassert_equal(tag_number, BACNET_APPLICATION_TAG_OBJECT_ID, NULL); + /* element 1 - APDU too small */ + apdu_len = bacnet_array_encode(object_instance, array_index, + bacnet_array_property_element_encode, + array_size, apdu, 1); + zassert_true(apdu_len == BACNET_STATUS_ABORT, NULL); /* element 2, in this test case, returns an error */ array_index = 2; apdu_len = bacnet_array_encode(object_instance, array_index, bacnet_array_property_element_encode, array_size, apdu, sizeof(apdu)); zassert_true(apdu_len < 0, NULL); + /* ALL - fits in APDU */ + array_index = BACNET_ARRAY_ALL; + apdu_len = bacnet_array_encode(object_instance, array_index, + bacnet_array_property_element_encode, + array_size, apdu, sizeof(apdu)); + zassert_true(apdu_len == 5, "len=%d", apdu_len); + /* ALL - APDU too small */ + apdu_len = bacnet_array_encode(object_instance, array_index, + bacnet_array_property_element_encode, + array_size, apdu, 4); + zassert_true(apdu_len == BACNET_STATUS_ABORT, NULL); } /**