From 1ff643229817ce1ec7bebd3bbf99f2dc4f2ab381 Mon Sep 17 00:00:00 2001 From: Christopher Haster Date: Tue, 9 Apr 2019 18:07:44 -0500 Subject: [PATCH] Added clarification on buffer alignment. In v2, the lookahead_buffer was changed from requiring 4-byte alignment to requiring 8-byte alignment. This was not documented as well as it could be, and as FabianInostroza noted, this also implies that lfs_malloc must provide 8-byte alignment. To protect against this, I've also added an assert on the alignment of both the lookahead_size and lookahead_buffer. found by FabianInostroza and amitv87 --- lfs.c | 3 ++- lfs.h | 5 +++-- lfs_util.h | 1 + 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/lfs.c b/lfs.c index 639e016..57a51de 100644 --- a/lfs.c +++ b/lfs.c @@ -3228,8 +3228,9 @@ static int lfs_init(lfs_t *lfs, const struct lfs_config *cfg) { lfs_cache_zero(lfs, &lfs->pcache); // setup lookahead, must be multiple of 64-bits - LFS_ASSERT(lfs->cfg->lookahead_size % 8 == 0); LFS_ASSERT(lfs->cfg->lookahead_size > 0); + LFS_ASSERT(lfs->cfg->lookahead_size % 8 == 0 && + (uintptr_t)lfs->cfg->lookahead_buffer % 8 == 0); if (lfs->cfg->lookahead_buffer) { lfs->free.buffer = lfs->cfg->lookahead_buffer; } else { diff --git a/lfs.h b/lfs.h index f797f66..ae991e0 100644 --- a/lfs.h +++ b/lfs.h @@ -215,8 +215,9 @@ struct lfs_config { // By default lfs_malloc is used to allocate this buffer. void *prog_buffer; - // Optional statically allocated program buffer. Must be lookahead_size. - // By default lfs_malloc is used to allocate this buffer. + // Optional statically allocated lookahead buffer. Must be lookahead_size + // and aligned to a 64-bit boundary. By default lfs_malloc is used to + // allocate this buffer. void *lookahead_buffer; // Optional upper limit on length of file names in bytes. No downside for diff --git a/lfs_util.h b/lfs_util.h index 1dc3b0f..28b1400 100644 --- a/lfs_util.h +++ b/lfs_util.h @@ -192,6 +192,7 @@ static inline uint32_t lfs_tobe32(uint32_t a) { uint32_t lfs_crc(uint32_t crc, const void *buffer, size_t size); // Allocate memory, only used if buffers are not provided to littlefs +// Note, memory must be 64-bit aligned static inline void *lfs_malloc(size_t size) { #ifndef LFS_NO_MALLOC return malloc(size);