RPM should return UNKNOWN_OBJECT for non-existent objects (#337)

* Return UNKNOWN_OBJECT for invalid object IDs

* Don't terminate RPM for UNKNOWN_OBJECT

* Review changes
This commit is contained in:
rcb-tcs
2022-09-26 23:06:39 -05:00
committed by GitHub
parent 32a312f974
commit 8fac5afdaa
+51 -3
View File
@@ -130,7 +130,16 @@ static int RPM_Encode_Property(
rpdata.array_index = rpmdata->array_index;
rpdata.application_data = &Temp_Buf[0];
rpdata.application_data_len = sizeof(Temp_Buf);
len = Device_Read_Property(&rpdata);
if ((rpmdata->object_property == PROP_ALL) ||
(rpmdata->object_property == PROP_REQUIRED) ||
(rpmdata->object_property == PROP_OPTIONAL)) {
/* special properties only get ERROR encoding */
len = BACNET_STATUS_ERROR;
} else {
len = Device_Read_Property(&rpdata);
}
if (len < 0) {
if ((len == BACNET_STATUS_ABORT) || (len == BACNET_STATUS_REJECT)) {
rpmdata->error_code = rpdata.error_code;
@@ -301,7 +310,26 @@ void handler_read_property_multiple(uint8_t *service_request,
unsigned index = 0;
BACNET_PROPERTY_ID special_object_property;
if (rpmdata.array_index != BACNET_ARRAY_ALL) {
if (!Device_Valid_Object_Id(rpmdata.object_type,
rpmdata.object_instance)) {
len = RPM_Encode_Property(
&Handler_Transmit_Buffer[npdu_len],
(uint16_t)apdu_len, MAX_APDU, &rpmdata);
if (len > 0) {
apdu_len += len;
} else {
#if PRINT_ENABLED
fprintf(stderr,
"RPM: Too full for property!\r\n");
#endif
error = len;
/* The berror flag ensures that
both loops will be broken! */
berror = true;
break;
}
} else if (rpmdata.array_index != BACNET_ARRAY_ALL) {
/* No array index options for this special property.
Encode error for this object property response */
len = rpm_ack_encode_apdu_object_property(
@@ -361,7 +389,27 @@ void handler_read_property_multiple(uint8_t *service_request,
response on OPTIONAL when empty. */
/* If no optional properties are supported then
an empty 'List of Results' shall be returned
for the specified property.*/
for the specified property, except if the
object does not exist. */
if (!Device_Valid_Object_Id(rpmdata.object_type,
rpmdata.object_instance)) {
len = RPM_Encode_Property(
&Handler_Transmit_Buffer[npdu_len],
(uint16_t)apdu_len, MAX_APDU, &rpmdata);
if (len > 0) {
apdu_len += len;
} else {
#if PRINT_ENABLED
fprintf(stderr,
"RPM: Too full for property!\r\n");
#endif
error = len;
/* The berror flag ensures that
both loops will be broken! */
berror = true;
break;
}
}
} else {
for (index = 0; index < property_count;
index++) {