This is an automated email from the ASF dual-hosted git repository.

vipulrahane pushed a commit to branch vipul/reboot_log_rotate_bug_fix
in repository https://gitbox.apache.org/repos/asf/mynewt-core.git

commit b1e3b00858a675ddd4adf2f0073daafdcf6adea1
Author: Vipul Rahane <[email protected]>
AuthorDate: Wed Apr 16 13:53:26 2025 -0700

    sys/reboot_log: Fix crash on rotate
    
    - Reboot was crash on rotate because the `l_arg` which points to the
    `fcb_log` was actually getting set to the `fcb`, thereby causing a
    crash. This fixes it.
---
 sys/log/full/src/log_fcb.c | 18 +++++++++++++++---
 1 file changed, 15 insertions(+), 3 deletions(-)

diff --git a/sys/log/full/src/log_fcb.c b/sys/log/full/src/log_fcb.c
index 9c7a02088..dd6b4ce15 100644
--- a/sys/log/full/src/log_fcb.c
+++ b/sys/log/full/src/log_fcb.c
@@ -914,6 +914,8 @@ log_fcb_copy_entry(struct log *log, struct fcb_entry *entry,
     uint16_t hdr_len;
     int dlen;
     int rc;
+    struct fcb_log fcb_log_tmp = {0};
+    struct fcb_log *fcb_log_ptr;
     struct fcb *fcb_tmp;
 
     rc = log_fcb_read(log, entry, &ueh, 0, LOG_BASE_ENTRY_HDR_SIZE);
@@ -932,12 +934,22 @@ log_fcb_copy_entry(struct log *log, struct fcb_entry 
*entry,
         goto err;
     }
 
-    /* Changing the fcb to be logged to be dst fcb */
+    /* Cache fcb_log pointer */
     fcb_tmp = &((struct fcb_log *)log->l_arg)->fl_fcb;
+    fcb_log_ptr = (struct fcb_log *)log->l_arg;
 
-    log->l_arg = dst_fcb;
+    /* Cache the fcb log, so that we preserve original fcb pointer and
+     * bookmark settings
+     */
+    memcpy(&fcb_log_tmp, log->l_arg, sizeof(struct fcb_log));
+    fcb_log_tmp.fl_fcb = *dst_fcb;
+    log->l_arg = &fcb_log_tmp;
     rc = log_fcb_append(log, data, dlen);
-    log->l_arg = fcb_tmp;
+
+    /* Restore the original fcb_log pointer */
+    log->l_arg = fcb_log_ptr;
+    ((struct fcb_log *)log->l_arg)->fl_fcb = *fcb_tmp;
+
     if (rc) {
         goto err;
     }

Reply via email to