Bugfix/service request refactor size check (#553)

* refactor service requests from service header

* add APDU size checking and length feature

* add unit tests to check for length when passing NULL buffer

---------

Co-authored-by: Steve Karg <skarg@users.sourceforge.net>
This commit is contained in:
Steve Karg
2024-01-05 08:59:45 -06:00
committed by GitHub
parent 5ca14e5320
commit bb081d28da
39 changed files with 2614 additions and 1514 deletions
+22 -17
View File
@@ -210,83 +210,88 @@ int bacapp_decode_context_property_state(
return len;
}
/**
* @brief Encode the BACnetPropertyState
* @param apdu Pointer to the buffer for encoding into, or NULL for length
* @param value Pointer to the value used for encoding
* @return number of bytes encoded, or zero if unable to encode
*/
int bacapp_encode_property_state(uint8_t *apdu, BACNET_PROPERTY_STATE *value)
{
int len = 0; /* length of each encoding */
if (value && apdu) {
if (value) {
switch (value->tag) {
case BOOLEAN_VALUE:
len = encode_context_boolean(
&apdu[0], 0, value->state.booleanValue);
apdu, 0, value->state.booleanValue);
break;
case BINARY_VALUE:
len = encode_context_enumerated(
&apdu[0], 1, value->state.binaryValue);
apdu, 1, value->state.binaryValue);
break;
case EVENT_TYPE:
len = encode_context_enumerated(
&apdu[0], 2, value->state.eventType);
apdu, 2, value->state.eventType);
break;
case POLARITY:
len = encode_context_enumerated(
&apdu[0], 3, value->state.polarity);
apdu, 3, value->state.polarity);
break;
case PROGRAM_CHANGE:
len = encode_context_enumerated(
&apdu[0], 4, value->state.programChange);
apdu, 4, value->state.programChange);
break;
case PROGRAM_STATE:
len = encode_context_enumerated(
&apdu[0], 5, value->state.programState);
apdu, 5, value->state.programState);
break;
case REASON_FOR_HALT:
len = encode_context_enumerated(
&apdu[0], 6, value->state.programError);
apdu, 6, value->state.programError);
break;
case RELIABILITY:
len = encode_context_enumerated(
&apdu[0], 7, value->state.reliability);
apdu, 7, value->state.reliability);
break;
case STATE:
len =
encode_context_enumerated(&apdu[0], 8, value->state.state);
encode_context_enumerated(apdu, 8, value->state.state);
break;
case SYSTEM_STATUS:
len = encode_context_enumerated(
&apdu[0], 9, value->state.systemStatus);
apdu, 9, value->state.systemStatus);
break;
case UNITS:
len =
encode_context_enumerated(&apdu[0], 10, value->state.units);
encode_context_enumerated(apdu, 10, value->state.units);
break;
case UNSIGNED_VALUE:
len = encode_context_unsigned(
&apdu[0], 11, value->state.unsignedValue);
apdu, 11, value->state.unsignedValue);
break;
case LIFE_SAFETY_MODE:
len = encode_context_enumerated(
&apdu[0], 12, value->state.lifeSafetyMode);
apdu, 12, value->state.lifeSafetyMode);
break;
case LIFE_SAFETY_STATE:
len = encode_context_enumerated(
&apdu[0], 13, value->state.lifeSafetyState);
apdu, 13, value->state.lifeSafetyState);
break;
default:
/* FIXME: assert(0); - return a negative len? */
break;
}
}