Merge pull request #519 from bacnet-stack/fix/rpm-decode-empty-array

Fix decoding empty array of complex type in RPM
This commit is contained in:
Ondřej Hruška
2023-10-23 10:09:32 +02:00
committed by GitHub
+19 -7
View File
@@ -118,15 +118,25 @@ int rpm_ack_decode_service_request(
more than one element to decode */ more than one element to decode */
value = calloc(1, sizeof(BACNET_APPLICATION_DATA_VALUE)); value = calloc(1, sizeof(BACNET_APPLICATION_DATA_VALUE));
rpm_property->value = value; rpm_property->value = value;
/* Special case for an empty array - we decode it as null */
if (apdu_len && decode_is_closing_tag_number(apdu, 4)) {
/* NULL value has tag 0, that was already set by calloc */
decoded_len++;
apdu_len--;
apdu++;
} else {
while (value && (apdu_len > 0)) { while (value && (apdu_len > 0)) {
len = bacapp_decode_known_property(apdu, (unsigned)apdu_len, len = bacapp_decode_known_property(apdu,
value, rpm_object->object_type, (unsigned)apdu_len, value, rpm_object->object_type,
rpm_property->propertyIdentifier); rpm_property->propertyIdentifier);
/* If len == 0 then it's an empty structure, which is OK. */ /* If len == 0 then it's an empty structure, which is
* OK. */
if (len < 0) { if (len < 0) {
/* problem decoding */ /* problem decoding */
PERROR("RPM Ack: unable to decode! %s:%s\n", PERROR("RPM Ack: unable to decode! %s:%s\n",
bactext_object_type_name(rpm_object->object_type), bactext_object_type_name(
rpm_object->object_type),
bactext_property_name( bactext_property_name(
rpm_property->propertyIdentifier)); rpm_property->propertyIdentifier));
/* note: caller will free the memory */ /* note: caller will free the memory */
@@ -142,18 +152,20 @@ int rpm_ack_decode_service_request(
break; break;
} else if (len > 0) { } else if (len > 0) {
old_value = value; old_value = value;
value = value = calloc(
calloc(1, sizeof(BACNET_APPLICATION_DATA_VALUE)); 1, sizeof(BACNET_APPLICATION_DATA_VALUE));
old_value->next = value; old_value->next = value;
} else { } else {
PERROR("RPM Ack: decoded %s:%s len=%d\n", PERROR("RPM Ack: decoded %s:%s len=%d\n",
bactext_object_type_name(rpm_object->object_type), bactext_object_type_name(
rpm_object->object_type),
bactext_property_name( bactext_property_name(
rpm_property->propertyIdentifier), rpm_property->propertyIdentifier),
len); len);
break; break;
} }
} }
}
} else if (apdu_len && decode_is_opening_tag_number(apdu, 5)) { } else if (apdu_len && decode_is_opening_tag_number(apdu, 5)) {
/* propertyAccessError */ /* propertyAccessError */
decoded_len++; decoded_len++;