Corrected octet string decoding in BACapp module for string length of zero. Added zeroes at the end of an octet string when initialized. Bug found by ptransfer unit test.

This commit is contained in:
skarg
2012-05-12 15:39:16 +00:00
parent d0038e6456
commit c0f2af65e0
3 changed files with 26 additions and 13 deletions
+4 -2
View File
@@ -264,8 +264,10 @@ int bacapp_decode_data(
}
}
if (len == 0 && tag_data_type != BACNET_APPLICATION_TAG_NULL &&
tag_data_type != BACNET_APPLICATION_TAG_BOOLEAN) {
if ((len == 0) &&
(tag_data_type != BACNET_APPLICATION_TAG_NULL) &&
(tag_data_type != BACNET_APPLICATION_TAG_BOOLEAN) &&
(tag_data_type != BACNET_APPLICATION_TAG_OCTET_STRING)) {
/* indicate that we were not able to decode the value */
value->tag = MAX_BACNET_APPLICATION_TAG;
}
+6 -2
View File
@@ -635,8 +635,12 @@ bool octetstring_init(
if (length <= MAX_OCTET_STRING_BYTES) {
if (value) {
for (i = 0; i < length; i++) {
octet_string->value[octet_string->length] = value[i];
octet_string->length++;
if (i < length) {
octet_string->value[octet_string->length] = value[i];
octet_string->length++;
} else {
octet_string->value[i] = 0;
}
}
} else {
for (i = 0; i < MAX_OCTET_STRING_BYTES; i++) {
+16 -9
View File
@@ -485,12 +485,14 @@ void test_Private_Transfer_Ack(
char private_data_chunk[32] = { "I Love You, Patricia!" };
BACNET_APPLICATION_DATA_VALUE data_value;
BACNET_APPLICATION_DATA_VALUE test_data_value;
bool status = false;
private_data.vendorID = BACNET_VENDOR_ID;
private_data.serviceNumber = 1;
bacapp_parse_application_data(BACNET_APPLICATION_TAG_OCTET_STRING,
status = bacapp_parse_application_data(BACNET_APPLICATION_TAG_OCTET_STRING,
&private_data_chunk[0], &data_value);
ct_test(pTest, status == true);
private_data_len =
bacapp_encode_application_data(&test_value[0], &data_value);
@@ -536,12 +538,14 @@ void test_Private_Transfer_Error(
char private_data_chunk[32] = { "I Love You, Patricia!" };
BACNET_APPLICATION_DATA_VALUE data_value;
BACNET_APPLICATION_DATA_VALUE test_data_value;
bool status = false;
private_data.vendorID = BACNET_VENDOR_ID;
private_data.serviceNumber = 1;
bacapp_parse_application_data(BACNET_APPLICATION_TAG_OCTET_STRING,
status = bacapp_parse_application_data(BACNET_APPLICATION_TAG_OCTET_STRING,
&private_data_chunk[0], &data_value);
ct_test(pTest, status == true);
private_data_len =
bacapp_encode_application_data(&test_value[0], &data_value);
private_data.serviceParameters = &test_value[0];
@@ -581,16 +585,18 @@ void test_Private_Transfer_Request(
uint8_t test_invoke_id = 0;
int private_data_len = 0;
char private_data_chunk[32] = { "I Love You, Patricia!" };
BACNET_APPLICATION_DATA_VALUE data_value;
BACNET_APPLICATION_DATA_VALUE test_data_value;
BACNET_PRIVATE_TRANSFER_DATA private_data;
BACNET_PRIVATE_TRANSFER_DATA test_data;
BACNET_APPLICATION_DATA_VALUE data_value = {0};
BACNET_APPLICATION_DATA_VALUE test_data_value = {0};
BACNET_PRIVATE_TRANSFER_DATA private_data = {0};
BACNET_PRIVATE_TRANSFER_DATA test_data = {0};
bool status = false;
private_data.vendorID = BACNET_VENDOR_ID;
private_data.serviceNumber = 1;
bacapp_parse_application_data(BACNET_APPLICATION_TAG_OCTET_STRING,
status = bacapp_parse_application_data(BACNET_APPLICATION_TAG_OCTET_STRING,
&private_data_chunk[0], &data_value);
ct_test(pTest, status == true);
private_data_len =
bacapp_encode_application_data(&test_value[0], &data_value);
private_data.serviceParameters = &test_value[0];
@@ -621,19 +627,20 @@ void test_Unconfirmed_Private_Transfer_Request(
uint8_t test_value[480] = { 0 };
int len = 0;
int apdu_len = 0;
uint8_t test_invoke_id = 0;
int private_data_len = 0;
char private_data_chunk[32] = { "I Love You, Patricia!" };
BACNET_APPLICATION_DATA_VALUE data_value;
BACNET_APPLICATION_DATA_VALUE test_data_value;
BACNET_PRIVATE_TRANSFER_DATA private_data;
BACNET_PRIVATE_TRANSFER_DATA test_data;
bool status = false;
private_data.vendorID = BACNET_VENDOR_ID;
private_data.serviceNumber = 1;
bacapp_parse_application_data(BACNET_APPLICATION_TAG_OCTET_STRING,
status = bacapp_parse_application_data(BACNET_APPLICATION_TAG_OCTET_STRING,
&private_data_chunk[0], &data_value);
ct_test(pTest, status == true);
private_data_len =
bacapp_encode_application_data(&test_value[0], &data_value);
private_data.serviceParameters = &test_value[0];