From 7535953235c9c20b4e882ae51101e4094f303271 Mon Sep 17 00:00:00 2001 From: Steve Karg Date: Tue, 3 Mar 2026 11:37:21 -0600 Subject: [PATCH] Prevent deletion of backup files during restore process (#1249) --- CHANGELOG.md | 1 + src/bacnet/basic/object/device.c | 12 ++++++++++++ src/bacnet/basic/server/bacnet_device.c | 14 +++++++++++++- 3 files changed, 26 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 784850fa..d37fee16 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -176,6 +176,7 @@ The git repositories are hosted at the following sites: ### Fixed +* Prevent deletion of backup files during restore process. (#1249) * Fixed Device Management-Backup and Restore-B Backup_Failure_Timeout to count down and abort at BACKUP_FAILURE or RESTORE_FAILURE states, successful STARTBACKUP to end in PERFORMING_A_BACKUP state, diff --git a/src/bacnet/basic/object/device.c b/src/bacnet/basic/object/device.c index 9fe3df57..989e60a3 100644 --- a/src/bacnet/basic/object/device.c +++ b/src/bacnet/basic/object/device.c @@ -3852,12 +3852,20 @@ void Device_End_Restore(void) #if defined BACNET_BACKUP_RESTORE BACNET_DATE_TIME bdateTime = { 0 }; BACNET_CREATE_OBJECT_DATA create_data = { 0 }; + struct object_functions *device_functions = NULL; + delete_object_function file_function = NULL; uint8_t apdu[MAX_APDU] = { 0 }; int32_t apdu_len = 0, offset = 0, file_size = 0; int decoded_len = 0; datetime_local(&bdateTime.date, &bdateTime.time, NULL, NULL); bacapp_timestamp_datetime_set(&Last_Restore_Time, &bdateTime); + /* avoid deleting our backup file - don't delete files */ + device_functions = Device_Object_Functions_Find(OBJECT_FILE); + if (device_functions) { + file_function = device_functions->Object_Delete; + device_functions->Object_Delete = NULL; + } /* delete all existing objects before restore */ Device_Delete_Objects(); /* create objects from the backup file */ @@ -3892,6 +3900,10 @@ void Device_End_Restore(void) if (Backup_State != BACKUP_STATE_RESTORE_FAILURE) { Backup_State = BACKUP_STATE_IDLE; } + if (device_functions) { + /* restore the delete-object for file objects */ + device_functions->Object_Delete = file_function; + } #endif } diff --git a/src/bacnet/basic/server/bacnet_device.c b/src/bacnet/basic/server/bacnet_device.c index 1723e105..c58491cf 100644 --- a/src/bacnet/basic/server/bacnet_device.c +++ b/src/bacnet/basic/server/bacnet_device.c @@ -135,7 +135,7 @@ defined(CONFIG_BACNET_BASIC_OBJECT_FILE) || \ defined(CONFIG_BACNET_BASIC_OBJECT_STRUCTURED_VIEW) || \ defined(CONFIG_BACNET_BASIC_OBJECT_BITSTRING_VALUE) || \ - defined(CONFIG_BACNET_BASIC_OBJECT_OCTET_STRING_VALUE) || \ + defined(CONFIG_BACNET_BASIC_OBJECT_OCTET_STRING_VALUE) || \ defined(CONFIG_BACNET_BASIC_OBJECT_TIME_VALUE) || \ defined(CONFIG_BACNET_BASIC_OBJECT_TIMER) || \ defined(CONFIG_BACNET_BASIC_OBJECT_LOOP) || \ @@ -3714,12 +3714,20 @@ void Device_End_Restore(void) #if defined BACNET_BACKUP_RESTORE BACNET_DATE_TIME bdateTime = { 0 }; BACNET_CREATE_OBJECT_DATA create_data = { 0 }; + struct object_functions *device_functions = NULL; + delete_object_function file_function = NULL; uint8_t apdu[MAX_APDU] = { 0 }; int32_t apdu_len = 0, offset = 0, file_size = 0; int decoded_len = 0; datetime_local(&bdateTime.date, &bdateTime.time, NULL, NULL); bacapp_timestamp_datetime_set(&Last_Restore_Time, &bdateTime); + /* avoid deleting our backup file - don't delete files */ + device_functions = Device_Object_Functions_Find(OBJECT_FILE); + if (device_functions) { + file_function = device_functions->Object_Delete; + device_functions->Object_Delete = NULL; + } /* delete all existing objects before restore */ Device_Delete_Objects(); /* create objects from the backup file */ @@ -3754,6 +3762,10 @@ void Device_End_Restore(void) if (Backup_State != BACKUP_STATE_RESTORE_FAILURE) { Backup_State = BACKUP_STATE_IDLE; } + if (device_functions) { + /* restore the delete-object for file objects */ + device_functions->Object_Delete = file_function; + } #endif }