From b17a7c608456db31c172754ac87343449cc1a286 Mon Sep 17 00:00:00 2001 From: Steve Karg Date: Wed, 4 Mar 2026 07:14:25 -0600 Subject: [PATCH] Add bacnet_strdup function to replace POSIX strdup and update bacfile to use it (#1251) --- CHANGELOG.md | 4 +++- src/bacnet/bacstr.c | 15 +++++++++++++++ src/bacnet/bacstr.h | 2 ++ src/bacnet/basic/object/bacfile.c | 24 ++++++------------------ 4 files changed, 26 insertions(+), 19 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index bed6a274..c6d137cf 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,7 +12,7 @@ The git repositories are hosted at the following sites: * https://bacnet.sourceforge.net/ * https://github.com/bacnet-stack/bacnet-stack/ -## [Unreleased] - 2026-02-23 +## [Unreleased] - 2026-03-04 ### Security @@ -152,6 +152,8 @@ The git repositories are hosted at the following sites: ### Changed +* Changed bacfile_strdup to bacnet_strdup function to replace POSIX strdup + and update bacfile to use bacnet_strdup. (#1251) * Changed PositiveInteger present-value datatype to BACNET_UNSIGNED_INTEGER. (#1246) * Changed BACFILE define dependencies to reflect bacfile-posix.c dependence diff --git a/src/bacnet/bacstr.c b/src/bacnet/bacstr.c index cae429f2..9975e776 100644 --- a/src/bacnet/bacstr.c +++ b/src/bacnet/bacstr.c @@ -2136,3 +2136,18 @@ int bacnet_snprintf( return write_length; } + +/** + * @brief duplicate a string (replacement for POSIX strdup) + * @param s - string to duplicate + * @return a pointer to a new string on success, or a null pointer + */ +char *bacnet_strdup(const char *s) +{ + size_t size = strlen(s) + 1; + char *p = malloc(size); + if (p != NULL) { + memcpy(p, s, size); + } + return p; +} diff --git a/src/bacnet/bacstr.h b/src/bacnet/bacstr.h index c5d3b5c1..c7127f78 100644 --- a/src/bacnet/bacstr.h +++ b/src/bacnet/bacstr.h @@ -238,6 +238,8 @@ char *bacnet_trim(char *str, const char *trimmedchars); BACNET_STACK_EXPORT char *bacnet_stptok(const char *s, char *tok, size_t toklen, const char *brk); +BACNET_STACK_EXPORT +char *bacnet_strdup(const char *s); #ifdef __cplusplus } diff --git a/src/bacnet/basic/object/bacfile.c b/src/bacnet/basic/object/bacfile.c index eec4f903..bf917997 100644 --- a/src/bacnet/basic/object/bacfile.c +++ b/src/bacnet/basic/object/bacfile.c @@ -116,21 +116,6 @@ void BACfile_Writable_Property_List( } } -/** - * @brief duplicate a string (replacement for POSIX strdup) - * @param s - string to duplicate - * @return a pointer to a new string on success, or a null pointer - */ -static char *bacfile_strdup(const char *s) -{ - size_t size = strlen(s) + 1; - char *p = malloc(size); - if (p != NULL) { - memcpy(p, s, size); - } - return p; -} - /** * @brief For a given object instance-number, returns the pathname * @param object_instance - object-instance number of the object @@ -161,7 +146,7 @@ void bacfile_pathname_set(uint32_t object_instance, const char *pathname) pObject = Keylist_Data(Object_List, object_instance); if (pObject) { free(pObject->Pathname); - pObject->Pathname = bacfile_strdup(pathname); + pObject->Pathname = bacnet_strdup(pathname); } } @@ -245,7 +230,7 @@ bool bacfile_object_name_set(uint32_t object_instance, const char *new_name) if (pObject) { status = true; free(pObject->Object_Name); - pObject->Object_Name = bacfile_strdup(new_name); + pObject->Object_Name = bacnet_strdup(new_name); } return status; @@ -698,7 +683,7 @@ void bacfile_file_type_set(uint32_t object_instance, const char *mime_type) pObject = Keylist_Data(Object_List, object_instance); if (pObject) { free(pObject->File_Type); - pObject->File_Type = bacfile_strdup(mime_type); + pObject->File_Type = bacnet_strdup(mime_type); } } @@ -1314,6 +1299,9 @@ bool bacfile_delete(uint32_t object_instance) pObject = Keylist_Data_Delete(Object_List, object_instance); if (pObject) { + free(pObject->Pathname); + free(pObject->File_Type); + free(pObject->Object_Name); free(pObject); status = true; }