From 594d5c14360a1c039798f40b076afdcdc6f07597 Mon Sep 17 00:00:00 2001 From: Ivan Grokhotkov Date: Sun, 28 Jan 2018 23:19:43 +0800 Subject: [PATCH] spiffs: check if OBJ_NAME_LEN + OBJ_META_LEN is within limits The limit was mentioned in spiffs_config.h but was not checked. Fixes https://github.com/espressif/esp-idf/issues/1546 --- components/spiffs/Kconfig | 13 +++++++++---- components/spiffs/include/spiffs_config.h | 5 ++++- 2 files changed, 13 insertions(+), 5 deletions(-) diff --git a/components/spiffs/Kconfig b/components/spiffs/Kconfig index 4eeb18762..262f0d678 100644 --- a/components/spiffs/Kconfig +++ b/components/spiffs/Kconfig @@ -76,10 +76,12 @@ config SPIFFS_OBJ_NAME_LEN default 32 range 1 256 help - Object name maximum length. Note that this length - include the zero-termination character, - meaning maximum string of characters can at most be - SPIFFS_OBJ_NAME_LEN - 1. + Object name maximum length. Note that this length include the + zero-termination character, meaning maximum string of characters + can at most be SPIFFS_OBJ_NAME_LEN - 1. + + SPIFFS_OBJ_NAME_LEN + SPIFFS_META_LENGTH should not exceed + SPIFFS_PAGE_SIZE - 64. config SPIFFS_USE_MAGIC bool "Enable SPIFFS Filesystem Magic" @@ -108,6 +110,9 @@ config SPIFFS_META_LENGTH These bytes can be used in an application-specific manner. Set this to at least 4 bytes to enable support for saving file modification time. + + SPIFFS_OBJ_NAME_LEN + SPIFFS_META_LENGTH should not exceed + SPIFFS_PAGE_SIZE - 64. config SPIFFS_USE_MTIME bool "Save file modification time" diff --git a/components/spiffs/include/spiffs_config.h b/components/spiffs/include/spiffs_config.h index 28414facf..a382ba6f9 100755 --- a/components/spiffs/include/spiffs_config.h +++ b/components/spiffs/include/spiffs_config.h @@ -153,12 +153,15 @@ extern void spiffs_api_unlock(struct spiffs_t *fs); // changes the on-disk format, so the change is not backward-compatible. // // Do note: the meta length must never exceed -// logical_page_size - (SPIFFS_OBJ_NAME_LEN + 64) +// logical_page_size - (SPIFFS_OBJ_NAME_LEN + SPIFFS_PAGE_EXTRA_SIZE) // // This is derived from following: // logical_page_size - (SPIFFS_OBJ_NAME_LEN + sizeof(spiffs_page_header) + // spiffs_object_ix_header fields + at least some LUT entries) #define SPIFFS_OBJ_META_LEN (CONFIG_SPIFFS_META_LENGTH) +#define SPIFFS_PAGE_EXTRA_SIZE (64) +_Static_assert(SPIFFS_OBJ_META_LEN + SPIFFS_OBJ_NAME_LEN + SPIFFS_PAGE_EXTRA_SIZE + <= CONFIG_SPIFFS_PAGE_SIZE, "SPIFFS_OBJ_META_LEN or SPIFFS_OBJ_NAME_LEN too long"); // Size of buffer allocated on stack used when copying data. // Lower value generates more read/writes. No meaning having it bigger