From 8bb93d3286db11ee7f0e8f0f805c48e8ce8ed480 Mon Sep 17 00:00:00 2001 From: GauiStori Date: Thu, 11 Jul 2024 16:23:55 +0200 Subject: [PATCH] Fixed basic device object and ReadRange handling for test 9.21.2.2 and 9.21.2.3 array index (#692) --- src/bacnet/basic/object/device.c | 16 ++++++++++++++-- src/bacnet/basic/service/h_rr.c | 5 +++++ 2 files changed, 19 insertions(+), 2 deletions(-) diff --git a/src/bacnet/basic/object/device.c b/src/bacnet/basic/object/device.c index 07802c9a..c644f3d2 100644 --- a/src/bacnet/basic/object/device.c +++ b/src/bacnet/basic/object/device.c @@ -2290,7 +2290,11 @@ bool DeviceGetRRInfo(BACNET_READ_RANGE_DATA *pRequest, /* Info on the request */ case PROP_UTC_TIME_SYNCHRONIZATION_RECIPIENTS: pInfo->RequestTypes = RR_BY_POSITION; pRequest->error_class = ERROR_CLASS_PROPERTY; - pRequest->error_code = ERROR_CODE_UNKNOWN_PROPERTY; + if (pRequest->array_index == BACNET_ARRAY_ALL) { + pRequest->error_code = ERROR_CODE_UNKNOWN_PROPERTY; + } else { + pRequest->error_code = ERROR_CODE_PROPERTY_IS_NOT_AN_ARRAY; + } break; case PROP_DEVICE_ADDRESS_BINDING: @@ -2302,11 +2306,19 @@ bool DeviceGetRRInfo(BACNET_READ_RANGE_DATA *pRequest, /* Info on the request */ case PROP_ACTIVE_COV_SUBSCRIPTIONS: pInfo->RequestTypes = RR_BY_POSITION; pRequest->error_class = ERROR_CLASS_PROPERTY; - pRequest->error_code = ERROR_CODE_UNKNOWN_PROPERTY; + if (pRequest->array_index == BACNET_ARRAY_ALL) { + pRequest->error_code = ERROR_CODE_UNKNOWN_PROPERTY; + } else { + pRequest->error_code = ERROR_CODE_PROPERTY_IS_NOT_AN_ARRAY; + } break; default: pRequest->error_class = ERROR_CLASS_SERVICES; pRequest->error_code = ERROR_CODE_PROPERTY_IS_NOT_A_LIST; + if (pRequest->array_index == BACNET_ARRAY_ALL) { + pRequest->error_code = ERROR_CODE_UNKNOWN_PROPERTY; + pRequest->error_class = ERROR_CLASS_PROPERTY; + } break; } diff --git a/src/bacnet/basic/service/h_rr.c b/src/bacnet/basic/service/h_rr.c index 9b3cf414..837680ad 100644 --- a/src/bacnet/basic/service/h_rr.c +++ b/src/bacnet/basic/service/h_rr.c @@ -81,6 +81,7 @@ static int Encode_RR_payload(uint8_t *apdu, BACNET_READ_RANGE_DATA *pRequest) (pRequest->array_index != 0) && (pRequest->array_index != BACNET_ARRAY_ALL)) { /* Array access attempted on a non array property */ + pRequest->error_class = ERROR_CLASS_PROPERTY; pRequest->error_code = ERROR_CODE_PROPERTY_IS_NOT_AN_ARRAY; } else if ((pRequest->RequestType != RR_READ_ALL) && ((PropInfo.RequestTypes & pRequest->RequestType) == 0)) { @@ -101,6 +102,10 @@ static int Encode_RR_payload(uint8_t *apdu, BACNET_READ_RANGE_DATA *pRequest) /* Either we don't support RR for this property yet or it is not a list * or array of lists */ pRequest->error_code = ERROR_CODE_PROPERTY_IS_NOT_A_LIST; + if (pRequest->array_index != BACNET_ARRAY_ALL) { + pRequest->error_class = ERROR_CLASS_PROPERTY; + pRequest->error_code = ERROR_CODE_PROPERTY_IS_NOT_AN_ARRAY; + } } return apdu_len;