aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRaphael S. Carvalho <raphael.scarv@gmail.com>2014-02-05 17:21:37 -0500
committerGene Cumm <gene.cumm@gmail.com>2014-04-03 13:35:06 -0400
commit2bf0922e80b35c79fcc56318e71b1da29f55df0c (patch)
treeabc13efcab93da3858d1545cde43dd7b69a3497f
parentc9ec0d59759721ba363a16f1af1b639aa57527b5 (diff)
downloadsyslinux-2bf0922e80b35c79fcc56318e71b1da29f55df0c.tar.gz
syslinux-2bf0922e80b35c79fcc56318e71b1da29f55df0c.tar.xz
syslinux-2bf0922e80b35c79fcc56318e71b1da29f55df0c.zip
core: Avoid initializing the cache more than once
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@gmail.com>
-rw-r--r--core/fs/cache.c2
-rw-r--r--core/fs/diskio.c1
-rw-r--r--core/fs/fs.c5
-rw-r--r--core/include/fs.h1
4 files changed, 7 insertions, 2 deletions
diff --git a/core/fs/cache.c b/core/fs/cache.c
index 3b21fc26..798c6222 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 7d95d674..e9a4c1da 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 6965d1da..0846c887 100644
--- a/core/fs/fs.c
+++ b/core/fs/fs.c
@@ -430,8 +430,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 22fd6bff..ba7d6742 100644
--- a/core/include/fs.h
+++ b/core/include/fs.h
@@ -133,6 +133,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;