From f278ccf37dbe27df5cc0e5bba2fd1a64f09ca453 Mon Sep 17 00:00:00 2001 From: Steve Karg Date: Wed, 29 Oct 2025 08:44:31 -0500 Subject: [PATCH] Added object list init into create function in cases where create is called before init. (#1122) --- CHANGELOG.md | 1 + src/bacnet/basic/object/ai.c | 3 +++ src/bacnet/basic/object/ao.c | 3 +++ src/bacnet/basic/object/auditlog.c | 3 +++ src/bacnet/basic/object/av.c | 3 +++ src/bacnet/basic/object/bacfile.c | 3 +++ src/bacnet/basic/object/bi.c | 3 +++ src/bacnet/basic/object/bitstring_value.c | 3 +++ src/bacnet/basic/object/blo.c | 3 +++ src/bacnet/basic/object/bo.c | 3 +++ src/bacnet/basic/object/bv.c | 3 +++ src/bacnet/basic/object/calendar.c | 3 +++ src/bacnet/basic/object/channel.c | 3 +++ src/bacnet/basic/object/color_object.c | 3 +++ src/bacnet/basic/object/color_temperature.c | 3 +++ src/bacnet/basic/object/csv.c | 3 +++ src/bacnet/basic/object/iv.c | 3 +++ src/bacnet/basic/object/lc.c | 3 +++ src/bacnet/basic/object/lo.c | 3 +++ src/bacnet/basic/object/lsp.c | 3 +++ src/bacnet/basic/object/lsz.c | 3 +++ src/bacnet/basic/object/ms-input.c | 3 +++ src/bacnet/basic/object/mso.c | 3 +++ src/bacnet/basic/object/msv.c | 3 +++ src/bacnet/basic/object/structured_view.c | 3 +++ src/bacnet/basic/object/time_value.c | 3 +++ 26 files changed, 76 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 52e525bc..febe5938 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -132,6 +132,7 @@ The git repositories are hosted at the following sites: ### Fixed +* Fixed object creation failure when create is called before init. (#1122) * Fixed octetstring_copy_value() and added unit tests. (#1121) * Fixed the MS/TP compare DER function which can now include the NPDU network priority in the comparison. (#1119) diff --git a/src/bacnet/basic/object/ai.c b/src/bacnet/basic/object/ai.c index 016cb435..c7457221 100644 --- a/src/bacnet/basic/object/ai.c +++ b/src/bacnet/basic/object/ai.c @@ -1700,6 +1700,9 @@ uint32_t Analog_Input_Create(uint32_t object_instance) unsigned j; #endif + if (!Object_List) { + Object_List = Keylist_Create(); + } if (object_instance > BACNET_MAX_INSTANCE) { return BACNET_MAX_INSTANCE; } else if (object_instance == BACNET_MAX_INSTANCE) { diff --git a/src/bacnet/basic/object/ao.c b/src/bacnet/basic/object/ao.c index 7b724178..507129a8 100644 --- a/src/bacnet/basic/object/ao.c +++ b/src/bacnet/basic/object/ao.c @@ -1301,6 +1301,9 @@ uint32_t Analog_Output_Create(uint32_t object_instance) int index = 0; unsigned priority = 0; + if (!Object_List) { + Object_List = Keylist_Create(); + } if (object_instance > BACNET_MAX_INSTANCE) { return BACNET_MAX_INSTANCE; } else if (object_instance == BACNET_MAX_INSTANCE) { diff --git a/src/bacnet/basic/object/auditlog.c b/src/bacnet/basic/object/auditlog.c index 26a97028..9d1158a1 100644 --- a/src/bacnet/basic/object/auditlog.c +++ b/src/bacnet/basic/object/auditlog.c @@ -1421,6 +1421,9 @@ uint32_t Audit_Log_Create(uint32_t object_instance) struct object_data *pObject = NULL; int index = 0; + if (!Object_List) { + Object_List = Keylist_Create(); + } if (object_instance > BACNET_MAX_INSTANCE) { return BACNET_MAX_INSTANCE; } else if (object_instance == BACNET_MAX_INSTANCE) { diff --git a/src/bacnet/basic/object/av.c b/src/bacnet/basic/object/av.c index 455c4876..6817922b 100644 --- a/src/bacnet/basic/object/av.c +++ b/src/bacnet/basic/object/av.c @@ -1770,6 +1770,9 @@ uint32_t Analog_Value_Create(uint32_t object_instance) unsigned j; #endif + if (!Object_List) { + Object_List = Keylist_Create(); + } if (object_instance > BACNET_MAX_INSTANCE) { return BACNET_MAX_INSTANCE; } else if (object_instance == BACNET_MAX_INSTANCE) { diff --git a/src/bacnet/basic/object/bacfile.c b/src/bacnet/basic/object/bacfile.c index 99e4ec57..3629ee68 100644 --- a/src/bacnet/basic/object/bacfile.c +++ b/src/bacnet/basic/object/bacfile.c @@ -1191,6 +1191,9 @@ uint32_t bacfile_create(uint32_t object_instance) struct object_data *pObject = NULL; int index = 0; + if (!Object_List) { + Object_List = Keylist_Create(); + } if (object_instance > BACNET_MAX_INSTANCE) { return BACNET_MAX_INSTANCE; } else if (object_instance == BACNET_MAX_INSTANCE) { diff --git a/src/bacnet/basic/object/bi.c b/src/bacnet/basic/object/bi.c index 1a9239b0..30e17f0a 100644 --- a/src/bacnet/basic/object/bi.c +++ b/src/bacnet/basic/object/bi.c @@ -1327,6 +1327,9 @@ uint32_t Binary_Input_Create(uint32_t object_instance) struct object_data *pObject = NULL; int index = 0; + if (!Object_List) { + Object_List = Keylist_Create(); + } if (object_instance > BACNET_MAX_INSTANCE) { return BACNET_MAX_INSTANCE; } else if (object_instance == BACNET_MAX_INSTANCE) { diff --git a/src/bacnet/basic/object/bitstring_value.c b/src/bacnet/basic/object/bitstring_value.c index b07deb24..413c79ef 100644 --- a/src/bacnet/basic/object/bitstring_value.c +++ b/src/bacnet/basic/object/bitstring_value.c @@ -831,6 +831,9 @@ uint32_t BitString_Value_Create(uint32_t object_instance) struct object_data *pObject = NULL; int index = 0; + if (!Object_List) { + Object_List = Keylist_Create(); + } if (object_instance > BACNET_MAX_INSTANCE) { return BACNET_MAX_INSTANCE; } else if (object_instance == BACNET_MAX_INSTANCE) { diff --git a/src/bacnet/basic/object/blo.c b/src/bacnet/basic/object/blo.c index 23961df7..37e10548 100644 --- a/src/bacnet/basic/object/blo.c +++ b/src/bacnet/basic/object/blo.c @@ -1561,6 +1561,9 @@ uint32_t Binary_Lighting_Output_Create(uint32_t object_instance) int index = 0; unsigned p = 0; + if (!Object_List) { + Object_List = Keylist_Create(); + } if (object_instance > BACNET_MAX_INSTANCE) { return BACNET_MAX_INSTANCE; } else if (object_instance == BACNET_MAX_INSTANCE) { diff --git a/src/bacnet/basic/object/bo.c b/src/bacnet/basic/object/bo.c index 8eeffd1f..e9f1510c 100644 --- a/src/bacnet/basic/object/bo.c +++ b/src/bacnet/basic/object/bo.c @@ -1285,6 +1285,9 @@ uint32_t Binary_Output_Create(uint32_t object_instance) struct object_data *pObject = NULL; int index = 0; + if (!Object_List) { + Object_List = Keylist_Create(); + } if (object_instance > BACNET_MAX_INSTANCE) { return BACNET_MAX_INSTANCE; } else if (object_instance == BACNET_MAX_INSTANCE) { diff --git a/src/bacnet/basic/object/bv.c b/src/bacnet/basic/object/bv.c index bdbebaa0..64464c60 100644 --- a/src/bacnet/basic/object/bv.c +++ b/src/bacnet/basic/object/bv.c @@ -1230,6 +1230,9 @@ uint32_t Binary_Value_Create(uint32_t object_instance) struct object_data *pObject = NULL; int index = 0; + if (!Object_List) { + Object_List = Keylist_Create(); + } if (object_instance > BACNET_MAX_INSTANCE) { return BACNET_MAX_INSTANCE; } else if (object_instance == BACNET_MAX_INSTANCE) { diff --git a/src/bacnet/basic/object/calendar.c b/src/bacnet/basic/object/calendar.c index cc5331e8..dde2209b 100644 --- a/src/bacnet/basic/object/calendar.c +++ b/src/bacnet/basic/object/calendar.c @@ -710,6 +710,9 @@ uint32_t Calendar_Create(uint32_t object_instance) struct object_data *pObject = NULL; int index = 0; + if (!Object_List) { + Object_List = Keylist_Create(); + } if (object_instance > BACNET_MAX_INSTANCE) { return BACNET_MAX_INSTANCE; } else if (object_instance == BACNET_MAX_INSTANCE) { diff --git a/src/bacnet/basic/object/channel.c b/src/bacnet/basic/object/channel.c index 6afd4c1f..bafecd45 100644 --- a/src/bacnet/basic/object/channel.c +++ b/src/bacnet/basic/object/channel.c @@ -1423,6 +1423,9 @@ uint32_t Channel_Create(uint32_t object_instance) int index = 0; unsigned m, g; + if (!Object_List) { + Object_List = Keylist_Create(); + } if (object_instance > BACNET_MAX_INSTANCE) { return BACNET_MAX_INSTANCE; } else if (object_instance == BACNET_MAX_INSTANCE) { diff --git a/src/bacnet/basic/object/color_object.c b/src/bacnet/basic/object/color_object.c index 189d1836..893053c3 100644 --- a/src/bacnet/basic/object/color_object.c +++ b/src/bacnet/basic/object/color_object.c @@ -1175,6 +1175,9 @@ uint32_t Color_Create(uint32_t object_instance) struct object_data *pObject = NULL; int index = 0; + if (!Object_List) { + Object_List = Keylist_Create(); + } if (object_instance > BACNET_MAX_INSTANCE) { return BACNET_MAX_INSTANCE; } else if (object_instance == BACNET_MAX_INSTANCE) { diff --git a/src/bacnet/basic/object/color_temperature.c b/src/bacnet/basic/object/color_temperature.c index 53e0b97d..01b51172 100644 --- a/src/bacnet/basic/object/color_temperature.c +++ b/src/bacnet/basic/object/color_temperature.c @@ -1618,6 +1618,9 @@ uint32_t Color_Temperature_Create(uint32_t object_instance) struct object_data *pObject = NULL; int index = 0; + if (!Object_List) { + Object_List = Keylist_Create(); + } if (object_instance > BACNET_MAX_INSTANCE) { return BACNET_MAX_INSTANCE; } else if (object_instance == BACNET_MAX_INSTANCE) { diff --git a/src/bacnet/basic/object/csv.c b/src/bacnet/basic/object/csv.c index cde636fc..69a5201a 100644 --- a/src/bacnet/basic/object/csv.c +++ b/src/bacnet/basic/object/csv.c @@ -120,6 +120,9 @@ uint32_t CharacterString_Value_Create(uint32_t object_instance) struct characterstring_object *pObject = NULL; int index; + if (!Object_List) { + Object_List = Keylist_Create(); + } if (object_instance > BACNET_MAX_INSTANCE) { return BACNET_MAX_INSTANCE; } else if (object_instance == BACNET_MAX_INSTANCE) { diff --git a/src/bacnet/basic/object/iv.c b/src/bacnet/basic/object/iv.c index f9895596..8a3f2f56 100644 --- a/src/bacnet/basic/object/iv.c +++ b/src/bacnet/basic/object/iv.c @@ -761,6 +761,9 @@ uint32_t Integer_Value_Create(uint32_t object_instance) { struct integer_object *pObject = NULL; + if (!Object_List) { + Object_List = Keylist_Create(); + } if (object_instance > BACNET_MAX_INSTANCE) { return BACNET_MAX_INSTANCE; } else if (object_instance == BACNET_MAX_INSTANCE) { diff --git a/src/bacnet/basic/object/lc.c b/src/bacnet/basic/object/lc.c index 676a5e3e..de67d1d6 100644 --- a/src/bacnet/basic/object/lc.c +++ b/src/bacnet/basic/object/lc.c @@ -1713,6 +1713,9 @@ uint32_t Load_Control_Create(uint32_t object_instance) struct shed_level_data *entry; unsigned i = 0; + if (!Object_List) { + Object_List = Keylist_Create(); + } if (object_instance > BACNET_MAX_INSTANCE) { return BACNET_MAX_INSTANCE; } else if (object_instance == BACNET_MAX_INSTANCE) { diff --git a/src/bacnet/basic/object/lo.c b/src/bacnet/basic/object/lo.c index 6e838a9a..b56f9f43 100644 --- a/src/bacnet/basic/object/lo.c +++ b/src/bacnet/basic/object/lo.c @@ -3421,6 +3421,9 @@ uint32_t Lighting_Output_Create(uint32_t object_instance) int index = 0; unsigned p = 0; + if (!Object_List) { + Object_List = Keylist_Create(); + } if (object_instance > BACNET_MAX_INSTANCE) { return BACNET_MAX_INSTANCE; } else if (object_instance == BACNET_MAX_INSTANCE) { diff --git a/src/bacnet/basic/object/lsp.c b/src/bacnet/basic/object/lsp.c index fa133ebe..98acbbe8 100644 --- a/src/bacnet/basic/object/lsp.c +++ b/src/bacnet/basic/object/lsp.c @@ -710,6 +710,9 @@ uint32_t Life_Safety_Point_Create(uint32_t object_instance) struct object_data *pObject = NULL; int index = 0; + if (!Object_List) { + Object_List = Keylist_Create(); + } if (object_instance > BACNET_MAX_INSTANCE) { return BACNET_MAX_INSTANCE; } else if (object_instance == BACNET_MAX_INSTANCE) { diff --git a/src/bacnet/basic/object/lsz.c b/src/bacnet/basic/object/lsz.c index f2005a8d..8486c1c2 100644 --- a/src/bacnet/basic/object/lsz.c +++ b/src/bacnet/basic/object/lsz.c @@ -887,6 +887,9 @@ uint32_t Life_Safety_Zone_Create(uint32_t object_instance) struct object_data *pObject = NULL; int index = 0; + if (!Object_List) { + Object_List = Keylist_Create(); + } if (object_instance > BACNET_MAX_INSTANCE) { return BACNET_MAX_INSTANCE; } else if (object_instance == BACNET_MAX_INSTANCE) { diff --git a/src/bacnet/basic/object/ms-input.c b/src/bacnet/basic/object/ms-input.c index 1bd98da0..af5920b9 100644 --- a/src/bacnet/basic/object/ms-input.c +++ b/src/bacnet/basic/object/ms-input.c @@ -994,6 +994,9 @@ uint32_t Multistate_Input_Create(uint32_t object_instance) struct object_data *pObject = NULL; int index = 0; + if (!Object_List) { + Object_List = Keylist_Create(); + } if (object_instance > BACNET_MAX_INSTANCE) { return BACNET_MAX_INSTANCE; } else if (object_instance == BACNET_MAX_INSTANCE) { diff --git a/src/bacnet/basic/object/mso.c b/src/bacnet/basic/object/mso.c index c20e2381..1cbbb9ca 100644 --- a/src/bacnet/basic/object/mso.c +++ b/src/bacnet/basic/object/mso.c @@ -1289,6 +1289,9 @@ uint32_t Multistate_Output_Create(uint32_t object_instance) int index = 0; unsigned priority = 0; + if (!Object_List) { + Object_List = Keylist_Create(); + } if (object_instance > BACNET_MAX_INSTANCE) { return BACNET_MAX_INSTANCE; } else if (object_instance == BACNET_MAX_INSTANCE) { diff --git a/src/bacnet/basic/object/msv.c b/src/bacnet/basic/object/msv.c index c53910de..4f982b0e 100644 --- a/src/bacnet/basic/object/msv.c +++ b/src/bacnet/basic/object/msv.c @@ -996,6 +996,9 @@ uint32_t Multistate_Value_Create(uint32_t object_instance) struct object_data *pObject = NULL; int index = 0; + if (!Object_List) { + Object_List = Keylist_Create(); + } if (object_instance > BACNET_MAX_INSTANCE) { return BACNET_MAX_INSTANCE; } else if (object_instance == BACNET_MAX_INSTANCE) { diff --git a/src/bacnet/basic/object/structured_view.c b/src/bacnet/basic/object/structured_view.c index 27130a82..422ac90f 100644 --- a/src/bacnet/basic/object/structured_view.c +++ b/src/bacnet/basic/object/structured_view.c @@ -820,6 +820,9 @@ uint32_t Structured_View_Create(uint32_t object_instance) struct object_data *pObject = NULL; int index = 0; + if (!Object_List) { + Object_List = Keylist_Create(); + } if (object_instance > BACNET_MAX_INSTANCE) { return BACNET_MAX_INSTANCE; } else if (object_instance == BACNET_MAX_INSTANCE) { diff --git a/src/bacnet/basic/object/time_value.c b/src/bacnet/basic/object/time_value.c index 748c0b90..3319e42f 100644 --- a/src/bacnet/basic/object/time_value.c +++ b/src/bacnet/basic/object/time_value.c @@ -806,6 +806,9 @@ uint32_t Time_Value_Create(uint32_t object_instance) struct object_data *pObject = NULL; int index = 0; + if (!Object_List) { + Object_List = Keylist_Create(); + } if (object_instance > BACNET_MAX_INSTANCE) { return BACNET_MAX_INSTANCE; } else if (object_instance == BACNET_MAX_INSTANCE) {