diff --git a/CHANGELOG.md b/CHANGELOG.md index 4b07595b..56363ae6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -48,6 +48,9 @@ The git repositories are hosted at the following sites: ### Fixed +* Fixed usage of Keylist_Data_Add() return value in Calendar, + CharacterString Value, Load Control, and BACnet/SC Network Port + objects. (#1016) * Fixed BACnet/IP initialization on a network interface where the system reports the interface's unicast IP address as being the same as its broadcast IP address (e.g., utunX interfaces for VPNs on macOS). (#1011) diff --git a/src/bacnet/basic/object/calendar.c b/src/bacnet/basic/object/calendar.c index 9d30a906..9e750dd2 100644 --- a/src/bacnet/basic/object/calendar.c +++ b/src/bacnet/basic/object/calendar.c @@ -236,7 +236,7 @@ Calendar_Date_List_Get(uint32_t object_instance, uint8_t index) bool Calendar_Date_List_Add( uint32_t object_instance, const BACNET_CALENDAR_ENTRY *value) { - bool st = false; + int index = 0; BACNET_CALENDAR_ENTRY *entry; struct object_data *pObject; @@ -249,12 +249,15 @@ bool Calendar_Date_List_Add( if (!entry) { return false; } - *entry = *value; - st = Keylist_Data_Add( + index = Keylist_Data_Add( pObject->Date_List, Keylist_Count(pObject->Date_List), entry); + if (index < 0) { + free(entry); + return false; + } - return st; + return true; } /** diff --git a/src/bacnet/basic/object/csv.c b/src/bacnet/basic/object/csv.c index 249242f5..76026ad2 100644 --- a/src/bacnet/basic/object/csv.c +++ b/src/bacnet/basic/object/csv.c @@ -85,6 +85,7 @@ void CharacterString_Value_Property_Lists( uint32_t CharacterString_Value_Create(uint32_t object_instance) { struct characterstring_object *pObject = NULL; + int index; if (object_instance > BACNET_MAX_INSTANCE) { return BACNET_MAX_INSTANCE; @@ -101,7 +102,7 @@ uint32_t CharacterString_Value_Create(uint32_t object_instance) pObject = calloc(1, sizeof(struct characterstring_object)); if (pObject) { /* add to list */ - int index = Keylist_Data_Add(Object_List, object_instance, pObject); + index = Keylist_Data_Add(Object_List, object_instance, pObject); if (index < 0) { free(pObject); return BACNET_MAX_INSTANCE; diff --git a/src/bacnet/basic/object/lc.c b/src/bacnet/basic/object/lc.c index 33dc19a3..35bbc106 100644 --- a/src/bacnet/basic/object/lc.c +++ b/src/bacnet/basic/object/lc.c @@ -1351,7 +1351,14 @@ static bool Load_Control_Shed_Levels_Write(BACNET_WRITE_PROPERTY_DATA *wp_data) entry = Keylist_Data_Delete_By_Index( pObject->Shed_Level_List, index); key = (uint32_t)unsigned_value; - Keylist_Data_Add(pObject->Shed_Level_List, key, entry); + index = + Keylist_Data_Add(pObject->Shed_Level_List, key, entry); + if (index < 0) { + wp_data->error_class = ERROR_CLASS_PROPERTY; + wp_data->error_code = + ERROR_CODE_NO_SPACE_TO_WRITE_PROPERTY; + return false; + } } else { wp_data->error_class = ERROR_CLASS_PROPERTY; wp_data->error_code = ERROR_CODE_VALUE_OUT_OF_RANGE; @@ -1370,7 +1377,13 @@ static bool Load_Control_Shed_Levels_Write(BACNET_WRITE_PROPERTY_DATA *wp_data) entry = Keylist_Data_Delete_By_Index( pObject->Shed_Level_List, index); key = (uint32_t)unsigned_value; - Keylist_Data_Add(pObject->Shed_Level_List, key, entry); + index = Keylist_Data_Add(pObject->Shed_Level_List, key, entry); + if (index < 0) { + wp_data->error_class = ERROR_CLASS_PROPERTY; + wp_data->error_code = ERROR_CODE_NO_SPACE_TO_WRITE_PROPERTY; + return false; + } + } else { wp_data->error_class = ERROR_CLASS_PROPERTY; wp_data->error_code = ERROR_CODE_VALUE_OUT_OF_RANGE; diff --git a/src/bacnet/basic/object/objects.c b/src/bacnet/basic/object/objects.c index d57f1fd7..2addd85e 100644 --- a/src/bacnet/basic/object/objects.c +++ b/src/bacnet/basic/object/objects.c @@ -54,6 +54,7 @@ OBJECT_DEVICE_T *objects_device_new(uint32_t device_instance) { OBJECT_DEVICE_T *pDevice = NULL; KEY key = device_instance; + int index; objects_init(); if (Device_List) { @@ -67,8 +68,15 @@ OBJECT_DEVICE_T *objects_device_new(uint32_t device_instance) pDevice->Object_Identifier.type = OBJECT_DEVICE; pDevice->Object_Identifier.instance = device_instance; pDevice->Object_Type = OBJECT_DEVICE; - pDevice->Object_List = Keylist_Create(); - Keylist_Data_Add(Device_List, key, pDevice); + index = Keylist_Data_Add(Device_List, key, pDevice); + if (index < 0) { + /* unable to add */ + free(pDevice); + pDevice = NULL; + } else { + /* successfully added */ + pDevice->Object_List = Keylist_Create(); + } } } } diff --git a/src/bacnet/basic/object/sc_netport.c b/src/bacnet/basic/object/sc_netport.c index 1bb979a7..7d757234 100644 --- a/src/bacnet/basic/object/sc_netport.c +++ b/src/bacnet/basic/object/sc_netport.c @@ -734,27 +734,31 @@ bool Network_Port_Routing_Table_Add( uint8_t status, uint8_t performance_index) { - bool st = false; + int index; uint8_t network_type; BACNET_ROUTER_ENTRY *entry; - BACNET_SC_PARAMS *params = Network_Port_SC_Params(object_instance); + BACNET_SC_PARAMS *params; + + params = Network_Port_SC_Params(object_instance); if (!params) { return false; } - network_type = Network_Port_Type(object_instance); entry = calloc(1, sizeof(BACNET_ROUTER_ENTRY)); if (!entry) { return false; } - entry->Network_Number = network_number; MAC_Address_Set(network_type, entry->Mac_Address, mac, mac_len); entry->Status = status; entry->Performance_Index = performance_index; - st = Keylist_Data_Add(params->Routing_Table, network_number, entry); + index = Keylist_Data_Add(params->Routing_Table, network_number, entry); + if (index < 0) { + free(entry); + return false; + } - return st; + return true; } bool Network_Port_Routing_Table_Delete(