diff --git a/bacnet-stack/include/bacstr.h b/bacnet-stack/include/bacstr.h index 100298ff..19f05236 100644 --- a/bacnet-stack/include/bacstr.h +++ b/bacnet-stack/include/bacstr.h @@ -38,16 +38,15 @@ #include #include #include "bacdef.h" +#include "config.h" /* bit strings They could be as large as 256/8=32 octets */ -#define MAX_BITSTRING_BYTES 15 typedef struct BACnet_Bit_String { uint8_t bits_used; uint8_t value[MAX_BITSTRING_BYTES]; } BACNET_BIT_STRING; -#define MAX_CHARACTER_STRING_BYTES (MAX_APDU-6) typedef struct BACnet_Character_String { size_t length; uint8_t encoding; @@ -60,7 +59,7 @@ typedef struct BACnet_Character_String { typedef struct BACnet_Octet_String { size_t length; /* limit - 6 octets is the most our tag and type could be */ - uint8_t value[MAX_APDU - 6]; + uint8_t value[MAX_OCTET_STRING_BYTES]; } BACNET_OCTET_STRING; #ifdef __cplusplus diff --git a/bacnet-stack/include/config.h b/bacnet-stack/include/config.h index 97c96f29..7f709f1f 100644 --- a/bacnet-stack/include/config.h +++ b/bacnet-stack/include/config.h @@ -134,4 +134,10 @@ #define BACAPP_OBJECT_ID #endif +/* +** Set the maximum vector type sizes +*/ +#define MAX_BITSTRING_BYTES (15) +#define MAX_CHARACTER_STRING_BYTES (MAX_APDU-6) +#define MAX_OCTET_STRING_BYTES (MAX_APDU-6) #endif diff --git a/bacnet-stack/src/bacstr.c b/bacnet-stack/src/bacstr.c index 8db0378e..647c69ea 100644 --- a/bacnet-stack/src/bacstr.c +++ b/bacnet-stack/src/bacstr.c @@ -167,7 +167,7 @@ uint8_t bitstring_bits_capacity( BACNET_BIT_STRING * bit_string) { if (bit_string) { - return (sizeof(bit_string->value) * 8); + return (MAX_BITSTRING_BYTES * 8); } else { return 0; } @@ -420,7 +420,7 @@ uint8_t characterstring_encoding( } /* returns false if the string exceeds capacity - initialize by using length=0 */ + initialize by using value=0 */ bool octetstring_init( BACNET_OCTET_STRING * octet_string, uint8_t * value, @@ -431,17 +431,18 @@ bool octetstring_init( if (octet_string) { octet_string->length = 0; - if (length <= sizeof(octet_string->value)) { - if (value) { - for (i = 0; i < length; i++) { - octet_string->value[octet_string->length] = value[i]; - octet_string->length++; - } - } else { - for (i = 0; i < sizeof(octet_string->value); i++) { - octet_string->value[i] = 0; - } - } + if (value) { + if (length <= MAX_OCTET_STRING_BYTES) { + for (i = 0; i < length; i++) { + octet_string->value[octet_string->length] = value[i]; + octet_string->length++; + } + status = true; + } + } else { + for (i = 0; i < MAX_OCTET_STRING_BYTES; i++) { + octet_string->value[i] = 0; + } status = true; } } @@ -467,7 +468,7 @@ bool octetstring_append( bool status = false; /* return value */ if (octet_string) { - if ((length + octet_string->length) <= sizeof(octet_string->value)) { + if ((length + octet_string->length) <= MAX_OCTET_STRING_BYTES) { for (i = 0; i < length; i++) { octet_string->value[octet_string->length] = value[i]; octet_string->length++; @@ -489,7 +490,7 @@ bool octetstring_truncate( bool status = false; /* return value */ if (octet_string) { - if (length <= sizeof(octet_string->value)) { + if (length <= MAX_OCTET_STRING_BYTES) { octet_string->length = length; status = true; } @@ -533,7 +534,7 @@ size_t octetstring_capacity( if (octet_string) { /* FIXME: validate length is within bounds? */ - length = sizeof(octet_string->value); + length = MAX_OCTET_STRING_BYTES; } return length; @@ -548,7 +549,7 @@ bool octetstring_value_same( if (octet_string1 && octet_string2) { if ((octet_string1->length == octet_string2->length) && - (octet_string1->length <= sizeof(octet_string1->value))) { + (octet_string1->length <= MAX_OCTET_STRING_BYTES)) { for (i = 0; i < octet_string1->length; i++) { if (octet_string1->value[i] != octet_string2->value[i]) { return false;