Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/littlefs-project/littlefs.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/lfs.c
diff options
context:
space:
mode:
authorChristopher Haster <chaster@utexas.edu>2018-08-22 02:15:40 +0300
committerChristopher Haster <chaster@utexas.edu>2018-09-04 21:57:22 +0300
commit3419284689ead61c6905d61359a2b62a8c09c75d (patch)
tree767f245462a6a59f61febb70c56853c9192b690e /lfs.c
parent510cd13df99843174899aa3ddabcbc889c7872e8 (diff)
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
Diffstat (limited to 'lfs.c')
-rw-r--r--lfs.c7
1 files changed, 5 insertions, 2 deletions
diff --git a/lfs.c b/lfs.c
index c6b5870..6b86536 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);