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
+43 -10
View File
@@ -26,27 +26,37 @@
#include "bacnet/authentication_factor.h"
#include "bacnet/bacdcode.h"
/**
* @brief Encode the BACnetAuthenticationFactor complex data
* @param apdu Pointer to the buffer for encoding into, or NULL for length
* @param data Pointer used for encoding the value
* @return number of bytes encoded, or zero if unable to encode
*/
int bacapp_encode_authentication_factor(
uint8_t *apdu, BACNET_AUTHENTICATION_FACTOR *af)
{
int len;
int apdu_len = 0;
len = encode_context_enumerated(&apdu[apdu_len], 0, af->format_type);
len = encode_context_enumerated(apdu, 0, af->format_type);
if (len < 0) {
return -1;
} else {
apdu_len += len;
if (apdu) {
apdu += len;
}
}
len = encode_context_unsigned(&apdu[apdu_len], 1, af->format_class);
len = encode_context_unsigned(apdu, 1, af->format_class);
if (len < 0) {
return -1;
} else {
apdu_len += len;
if (apdu) {
apdu += len;
}
}
len = encode_context_octet_string(&apdu[apdu_len], 2, &af->value);
len = encode_context_octet_string(apdu, 2, &af->value);
if (len < 0) {
return -1;
} else {
@@ -56,24 +66,40 @@ int bacapp_encode_authentication_factor(
return apdu_len;
}
/**
* @brief Encode the BACnetAuthenticationFactor context tagged complex data
* @param apdu Pointer to the buffer for encoding into, or NULL for length
* @param data Pointer used for encoding the value
* @return number of bytes encoded, or zero if unable to encode
*/
int bacapp_encode_context_authentication_factor(
uint8_t *apdu, uint8_t tag, BACNET_AUTHENTICATION_FACTOR *af)
{
int len;
int apdu_len = 0;
len = encode_opening_tag(&apdu[apdu_len], tag);
len = encode_opening_tag(apdu, tag);
apdu_len += len;
len = bacapp_encode_authentication_factor(&apdu[apdu_len], af);
if (apdu) {
apdu += len;
}
len = bacapp_encode_authentication_factor(apdu, af);
apdu_len += len;
len = encode_closing_tag(&apdu[apdu_len], tag);
if (apdu) {
apdu += len;
}
len = encode_closing_tag(apdu, tag);
apdu_len += len;
return apdu_len;
}
/**
* @brief Decode the BACnetAuthenticationFactor complex data
* @param apdu Pointer to the buffer for decoding.
* @param af Pointer to the property decoded data to be stored
* @return Bytes decoded or BACNET_STATUS_REJECT on error.
*/
int bacapp_decode_authentication_factor(
uint8_t *apdu, BACNET_AUTHENTICATION_FACTOR *af)
{
@@ -123,6 +149,13 @@ int bacapp_decode_authentication_factor(
return apdu_len;
}
/**
* @brief Decode the context tagged BACnetAuthenticationFactor complex data
* @param apdu Pointer to the buffer for decoding.
* @param tag context tag number wrapping the complex data
* @param af Pointer to the property decoded data to be stored
* @return Bytes decoded or BACNET_STATUS_REJECT on error.
*/
int bacapp_decode_context_authentication_factor(
uint8_t *apdu, uint8_t tag, BACNET_AUTHENTICATION_FACTOR *af)
{