From 3419284689ead61c6905d61359a2b62a8c09c75d Mon Sep 17 00:00:00 2001 From: Christopher Haster Date: Tue, 21 Aug 2018 18:15:40 -0500 Subject: [PATCH] Fixed issue with corruption due to different cache sizes The lfs_cache_zero function that was recently added assumed a single cache size, which is incorrect. This would cause a buffer overflow if read_size != prog_size. Since lfs_cache_zero is only used for scrubbing prog caches, the fix here is to use lfs_cache_drop instead on read caches. Info in read caches should never make its way to disk. Found by nstcl --- lfs.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/lfs.c b/lfs.c index c6b5870395c..6b86536974c 100644 --- a/lfs.c +++ b/lfs.c @@ -1373,7 +1373,10 @@ int lfs_file_opencfg(lfs_t *lfs, lfs_file_t *file, } // zero to avoid information leak - lfs_cache_zero(lfs, &file->cache); + lfs_cache_drop(lfs, &file->cache); + if ((file->flags & 3) != LFS_O_RDONLY) { + lfs_cache_zero(lfs, &file->cache); + } // add to list of files file->next = lfs->files; @@ -2055,8 +2058,8 @@ static int lfs_init(lfs_t *lfs, const struct lfs_config *cfg) { } // zero to avoid information leaks - lfs_cache_zero(lfs, &lfs->rcache); lfs_cache_zero(lfs, &lfs->pcache); + lfs_cache_drop(lfs, &lfs->rcache); // setup lookahead, round down to nearest 32-bits LFS_ASSERT(lfs->cfg->lookahead % 32 == 0);