Raphael S.Carvalho
2013-Dec-26 01:57 UTC
[syslinux] [PATCH] core: Avoid initializing the cache more than once
From: Raphael S. Carvalho <raphael.scarv at gmail.com> Most of file system drivers initialize the cache themselves. The problem is that the same cache could be again initialized later, then invalidating the previous one. This patch fixes this. Problem found while auditing the code. Signed-off-by: Raphael S. Carvalho <raphael.scarv at gmail.com> --- core/fs/cache.c | 2 ++ core/fs/diskio.c | 1 + core/fs/fs.c | 5 +++-- core/include/fs.h | 1 + 4 files changed, 7 insertions(+), 2 deletions(-) diff --git a/core/fs/cache.c b/core/fs/cache.c index 3b21fc2..798c622 100644 --- a/core/fs/cache.c +++ b/core/fs/cache.c @@ -55,6 +55,8 @@ void cache_init(struct device *dev, int block_size_shift) data += dev->cache_block_size; prev = cur++; } + + dev->cache_init = 1; /* Set cache as initialized */ } /* diff --git a/core/fs/diskio.c b/core/fs/diskio.c index 7d95d67..e9a4c1d 100644 --- a/core/fs/diskio.c +++ b/core/fs/diskio.c @@ -28,6 +28,7 @@ struct device * device_init(void *args) dev.disk = firmware->disk_init(args); dev.cache_size = 128*1024; dev.cache_data = malloc(dev.cache_size); + dev.cache_init = 0; /* Explicitly set cache as uninitialized */ return &dev; } diff --git a/core/fs/fs.c b/core/fs/fs.c index 8c1feea..d6da8a5 100644 --- a/core/fs/fs.c +++ b/core/fs/fs.c @@ -422,8 +422,9 @@ void fs_init(const struct fs_ops **ops, void *priv) } this_fs = &fs; - /* initialize the cache */ - if (fs.fs_dev && fs.fs_dev->cache_data) + /* initialize the cache only if it wasn't already initialized + * by the fs driver */ + if (fs.fs_dev && fs.fs_dev->cache_data && !fs.fs_dev->cache_init) cache_init(fs.fs_dev, blk_shift); /* start out in the root directory */ diff --git a/core/include/fs.h b/core/include/fs.h index 31ef315..1062893 100644 --- a/core/include/fs.h +++ b/core/include/fs.h @@ -130,6 +130,7 @@ struct device { struct disk *disk; /* the cache stuff */ + uint8_t cache_init; /* cache initialized state */ char *cache_data; struct cache *cache_head; uint16_t cache_block_size; -- 1.7.2.5