From 796be705ac9ea6e6872b4232a1ad6f5ff3f1a9d6 Mon Sep 17 00:00:00 2001 From: Christopher Haster Date: Mon, 18 Mar 2024 01:08:59 -0500 Subject: [PATCH] Simplified how we check on-disk versions a bit We don't really need to do full leb128 decoding since our version numbers are unlikely to ever actually exceed v127.127. Worst case, if they do, the version that exceeds v127.127 can switch to using leb128 decoding without breaking backwards compatibility. Version attr encoding: .---+---+---+---+---+---. tag (0x0004): 1 be16 2 bytes | x0004 | 0 | 2 |maj|min| weight (0): 1 leb128 1 byte '---+---+---+---+---+---' size (2): 1 leb128 1 byte major_version: 1 leb128 1 byte minor_version: 1 leb128 1 byte total: 6 bytes Code changes: code stack before: 34124 2880 after: 34092 (-0.1%) 2880 (+0.0%) --- lfs.c | 26 +++++++------------------- 1 file changed, 7 insertions(+), 19 deletions(-) diff --git a/lfs.c b/lfs.c index 1dd031e1..2f7a17e3 100644 --- a/lfs.c +++ b/lfs.c @@ -7924,30 +7924,18 @@ static int lfsr_mountmroot(lfs_t *lfs, const lfsr_mdir_t *mroot) { return err; } - uint32_t major_version; - err = lfsr_data_readleb128(lfs, &data, &major_version); - if (err && err != LFS_ERR_CORRUPT) { + uint8_t version[2] = {0, 0}; + lfs_ssize_t d = lfsr_data_read(lfs, &data, version, 2); + if (d < 0) { return err; } - if (err == LFS_ERR_CORRUPT) { - major_version = -1; - } - uint32_t minor_version; - err = lfsr_data_readleb128(lfs, &data, &minor_version); - if (err && err != LFS_ERR_CORRUPT) { - return err; - } - if (err == LFS_ERR_CORRUPT) { - minor_version = -1; - } - - if (major_version != LFS_DISK_VERSION_MAJOR - || minor_version > LFS_DISK_VERSION_MINOR) { + if (version[0] != LFS_DISK_VERSION_MAJOR + || version[1] > LFS_DISK_VERSION_MINOR) { LFS_ERROR("Incompatible version v%"PRId32".%"PRId32 " (!= v%"PRId32".%"PRId32")", - major_version, - minor_version, + version[0], + version[1], LFS_DISK_VERSION_MAJOR, LFS_DISK_VERSION_MINOR); return LFS_ERR_INVAL;