diff --git a/subsys/fs/zms/zms.c b/subsys/fs/zms/zms.c index be89b7f8c5c327b..ca889362bbfc887 100644 --- a/subsys/fs/zms/zms.c +++ b/subsys/fs/zms/zms.c @@ -673,7 +673,7 @@ static int zms_add_empty_ate(struct zms_fs *fs, uint64_t addr) empty_ate.id = ZMS_HEAD_ID; empty_ate.len = 0xffff; empty_ate.offset = 0U; - empty_ate.data = 0xffffffff; + empty_ate.data = ZMS_DEFAULT_VERSION; rc = zms_get_sector_cycle(fs, addr, &cycle_cnt); if (rc) { if (rc == -ENOENT) { @@ -989,6 +989,12 @@ static int zms_init(struct zms_fs *fs) (close_ate.cycle_cnt == empty_ate.cycle_cnt)) { /* closed sector */ closed_sectors++; + /* Let's check first that we support this ZMS version */ + if (ZMS_GET_VERSION(empty_ate.data) != ZMS_DEFAULT_VERSION) { + LOG_ERR("ZMS Version is not supported"); + rc = -ENOEXEC; + goto end; + } zms_sector_advance(fs, &addr); /* addr is pointing to the close ATE */ rc = zms_get_sector_header(fs, addr, &empty_ate, &close_ate); @@ -1033,6 +1039,13 @@ static int zms_init(struct zms_fs *fs) zms_flash_erase_sector(fs, addr); } zms_add_empty_ate(fs, addr); + } else { + /* empty_ate is valid let's check the version */ + if (ZMS_GET_VERSION(empty_ate.data) != ZMS_DEFAULT_VERSION) { + LOG_ERR("ZMS Version is not supported"); + rc = -ENOEXEC; + goto end; + } } rc = zms_get_sector_cycle(fs, addr, &fs->sector_cycle); if (rc) { @@ -1186,6 +1199,7 @@ static int zms_init(struct zms_fs *fs) rc = zms_add_gc_done_ate(fs); } k_mutex_unlock(&fs->zms_lock); + return rc; } diff --git a/subsys/fs/zms/zms_priv.h b/subsys/fs/zms/zms_priv.h index f9f4b44e6cb15bd..b9840ad82448659 100644 --- a/subsys/fs/zms/zms_priv.h +++ b/subsys/fs/zms/zms_priv.h @@ -22,6 +22,9 @@ extern "C" { #define ADDR_OFFS_MASK GENMASK64(31, 0) #define SECTOR_NUM(x) FIELD_GET(ADDR_SECT_MASK, x) +#define ZMS_VERSION_MASK GENMASK(7, 0) +#define ZMS_GET_VERSION(x) FIELD_GET(ZMS_VERSION_MASK, x) +#define ZMS_DEFAULT_VERSION 1 #define ZMS_BLOCK_SIZE 32 #define ZMS_LOOKUP_CACHE_NO_ADDR GENMASK64(63, 0) diff --git a/tests/subsys/fs/zms/src/main.c b/tests/subsys/fs/zms/src/main.c index 64398070d903943..5258094d380094c 100644 --- a/tests/subsys/fs/zms/src/main.c +++ b/tests/subsys/fs/zms/src/main.c @@ -587,7 +587,7 @@ ZTEST_F(zms, test_zms_gc_corrupt_close_ate) empty_ate.id = 0xFFFFFFFF; empty_ate.offset = 0; empty_ate.len = 0xFFFF; - empty_ate.data = 0xffffffff; + empty_ate.data = 0x1; empty_ate.cycle_cnt = 1; empty_ate.crc8 = crc8_ccitt(0xff, &empty_ate, offsetof(struct zms_ate, crc8)); ate.id = 0x1;