From a0e0ea20812c99d3d59aa67c26dfac973819b255 Mon Sep 17 00:00:00 2001 From: Christopher Haster Date: Fri, 12 Jul 2024 01:37:13 -0500 Subject: [PATCH] Switched to asserting only-known flags So instead of asserting on explicitly disallowed flags, we assert that all passed flags are in the relevant flag set. This is a bit safer. --- lfs.c | 38 ++++++++++++++++++++++++++++---------- 1 file changed, 28 insertions(+), 10 deletions(-) diff --git a/lfs.c b/lfs.c index f5157e14..ad8d8370 100644 --- a/lfs.c +++ b/lfs.c @@ -9866,15 +9866,23 @@ int lfsr_file_opencfg(lfs_t *lfs, lfsr_file_t *file, LFS_ASSERT(!lfsr_omdir_isopen(lfs, &file->o.o)); // don't allow the forbidden mode! LFS_ASSERT((flags & 3) != 3); + // unknown flags? + LFS_ASSERT((flags + & ~LFS_O_RDONLY + & ~LFS_O_WRONLY + & ~LFS_O_RDWR + & ~LFS_O_CREAT + & ~LFS_O_EXCL + & ~LFS_O_TRUNC + & ~LFS_O_APPEND + & ~LFS_O_FLUSH + & ~LFS_O_SYNC + & ~LFS_O_DESYNC) == 0); // these flags require a writable file LFS_ASSERT(!lfsr_o_isrdonly(flags) || !lfsr_o_iscreat(flags)); LFS_ASSERT(!lfsr_o_isrdonly(flags) || !lfsr_o_isexcl(flags)); LFS_ASSERT(!lfsr_o_isrdonly(flags) || !lfsr_o_istrunc(flags)); LFS_ASSERT(!lfsr_o_isrdonly(flags) || !lfsr_o_isappend(flags)); - // these flags are internal and shouldn't be provided by the user - LFS_ASSERT(!lfsr_f_isunflush(flags)); - LFS_ASSERT(!lfsr_f_isunsync(flags)); - LFS_ASSERT(!lfsr_f_isorphan(flags)); if (!lfsr_o_isrdonly(flags)) { // prepare our filesystem for writing @@ -12820,9 +12828,14 @@ int lfsr_fs_gc(lfs_t *lfs, uint32_t flags) { // some flags don't make sense when only traversing the mtree LFS_ASSERT(!lfsr_t_ismtreeonly(flags) || !lfsr_t_islookahead(flags)); LFS_ASSERT(!lfsr_t_ismtreeonly(flags) || !lfsr_t_isckdata(flags)); - // these flags are internal and shouldn't be provided by the user - LFS_ASSERT(!lfsr_f_isdirty(flags)); - LFS_ASSERT(!lfsr_f_ismutated(flags)); + // unknown flags? + LFS_ASSERT((flags + & ~LFS_GC_MTREEONLY + & ~LFS_GC_MKCONSISTENT + & ~LFS_GC_LOOKAHEAD + & ~LFS_GC_COMPACT + & ~LFS_GC_CKMETA + & ~LFS_GC_CKDATA) == 0); // fix pending grms if requested if (lfsr_t_ismkconsistent(flags) @@ -12970,12 +12983,17 @@ static int lfsr_traversal_rewind_(lfs_t *lfs, lfsr_traversal_t *t); int lfsr_traversal_open(lfs_t *lfs, lfsr_traversal_t *t, uint32_t flags) { // already open? LFS_ASSERT(!lfsr_omdir_isopen(lfs, &t->o.o)); + // unknown flags? + LFS_ASSERT((flags + & ~LFS_T_MTREEONLY + & ~LFS_T_MKCONSISTENT + & ~LFS_T_LOOKAHEAD + & ~LFS_T_COMPACT + & ~LFS_T_CKMETA + & ~LFS_T_CKDATA) == 0); // some flags don't make sense when only traversing the mtree LFS_ASSERT(!lfsr_t_ismtreeonly(flags) || !lfsr_t_islookahead(flags)); LFS_ASSERT(!lfsr_t_ismtreeonly(flags) || !lfsr_t_isckdata(flags)); - // these flags are internal and shouldn't be provided by the user - LFS_ASSERT(!lfsr_f_isdirty(flags)); - LFS_ASSERT(!lfsr_f_ismutated(flags)); // setup traversal state t->o.o.type = LFS_TYPE_TRAVERSAL;