Beware that this post is related to an SDK in maintenance mode
More Info: Consider nRF Connect SDK for new designs
This post is older than 2 years and might not be relevant anymore
More Info: Consider searching for newer posts

FDS - data corruption

Hi,

I found a bug in fds module (Flash Data Storage) which lead to data system corruption.

Scenario:

  • Given the device started GC(Garbage Collection) procedure

  • When the device will reset during the in the certain moment of page swap procedure.

  • Then assigning new record id will overlap existing ones.

When just first two words of a record are copied to the swap page, the header of this record will pass header_check function.

During the page_scan procedure, this corrupted header will be used to update m_latest_rec_id. It will result in assigning new record ids from 0.

Solution:

I have updated header_check function to check record_id against 0xFFFFFFFF value, and now I am testing this workaround.

Parents Reply
  • Yes, I have fixed 2 issues.

    /**@brief   Not initialized record id.
     */
    #define FDS_RECORD_ID_NOT_INIT     (0xFFFFFFFF)
    
    fds_header_status_t fds_header_check(fds_header_t const * p_hdr, uint32_t const * p_page_end)
    {
        if (((uint32_t*)header_jump(p_hdr) > p_page_end))
        {
            // The length field would jump across the page boundary.
            // FDS won't allow writing such a header, therefore it has been corrupted.
            return FDS_HEADER_CORRUPT;
        }
    
        if (   (p_hdr->file_id    == FDS_FILE_ID_INVALID)
            || (p_hdr->record_key == FDS_RECORD_KEY_DIRTY)
            || (p_hdr->record_id  == FDS_RECORD_ID_NOT_INIT))
        {
            return FDS_HEADER_DIRTY;
        }
    
        return FDS_HEADER_VALID;
    }

    I am still struggling with one more. The one with losing swap page after power failure. 

Children
Related