From 2384200ca9b91270783ab460a8bb6e41b1b6ee3e Mon Sep 17 00:00:00 2001 From: Peter Andersson Date: Tue, 28 Feb 2017 08:17:41 +0100 Subject: [PATCH] fixes indicate eof properly #104 --- src/spiffs_hydrogen.c | 11 +++++++++- src/test/test_bugreports.c | 4 ++-- src/test/test_hydrogen.c | 43 ++++++++++++++++++++++++++++++++++++++ src/test/test_spiffs.c | 4 ++-- 4 files changed, 57 insertions(+), 5 deletions(-) diff --git a/src/spiffs_hydrogen.c b/src/spiffs_hydrogen.c index 1c2cbd9..fba9af7 100644 --- a/src/spiffs_hydrogen.c +++ b/src/spiffs_hydrogen.c @@ -356,7 +356,7 @@ spiffs_file SPIFFS_open_by_page(spiffs *fs, spiffs_page_ix page_ix, spiffs_flags return SPIFFS_FH_OFFS(fs, fd->file_nbr); } -s32_t SPIFFS_read(spiffs *fs, spiffs_file fh, void *buf, s32_t len) { +static s32_t spiffs_hydro_read(spiffs *fs, spiffs_file fh, void *buf, s32_t len) { SPIFFS_API_CHECK_CFG(fs); SPIFFS_API_CHECK_MOUNT(fs); SPIFFS_LOCK(fs); @@ -410,6 +410,15 @@ s32_t SPIFFS_read(spiffs *fs, spiffs_file fh, void *buf, s32_t len) { return len; } +s32_t SPIFFS_read(spiffs *fs, spiffs_file fh, void *buf, s32_t len) { + s32_t res = spiffs_hydro_read(fs, fh, buf, len); + if (res == SPIFFS_ERR_END_OF_OBJECT) { + res = 0; + } + return res; +} + + #if !SPIFFS_READ_ONLY static s32_t spiffs_hydro_write(spiffs *fs, spiffs_fd *fd, void *buf, u32_t offset, s32_t len) { (void)fs; diff --git a/src/test/test_bugreports.c b/src/test/test_bugreports.c index 3cd0b18..2484f86 100644 --- a/src/test/test_bugreports.c +++ b/src/test/test_bugreports.c @@ -343,7 +343,7 @@ TEST(zero_sized_file_44) { u8_t buf[8]; res = SPIFFS_read(FS, fd, buf, 8); - TEST_CHECK_LT(res, 0); + TEST_CHECK_EQ(res, 0); TEST_CHECK_EQ(SPIFFS_errno(FS), SPIFFS_ERR_END_OF_OBJECT); res = SPIFFS_read(FS, fd, buf, 0); @@ -371,7 +371,7 @@ TEST(zero_sized_file_44) { TEST_CHECK_EQ(b, 2); res = SPIFFS_read(FS, fd, buf, 8); - TEST_CHECK_LT(res, 0); + TEST_CHECK_EQ(res, 0); TEST_CHECK_EQ(SPIFFS_errno(FS), SPIFFS_ERR_END_OF_OBJECT); return TEST_RES_OK; diff --git a/src/test/test_hydrogen.c b/src/test/test_hydrogen.c index cc4a7a2..2245025 100644 --- a/src/test/test_hydrogen.c +++ b/src/test/test_hydrogen.c @@ -1290,6 +1290,48 @@ TEST(read_beyond) } TEST_END +TEST(read_beyond2) +{ + char *name = "file"; + spiffs_file fd; + s32_t res; + const s32_t size = SPIFFS_DATA_PAGE_SIZE(FS); + + u8_t buf[size*2]; + memrand(buf, size); + + res = test_create_file(name); + CHECK(res >= 0); + fd = SPIFFS_open(FS, name, SPIFFS_APPEND | SPIFFS_RDWR, 0); + CHECK(fd >= 0); + res = SPIFFS_write(FS, fd, buf, size); + CHECK(res >= 0); + + spiffs_stat stat; + res = SPIFFS_fstat(FS, fd, &stat); + CHECK(res >= 0); + CHECK(stat.size == size); + + SPIFFS_close(FS, fd); + + int i,j; + for (j = 1; j <= size+1; j++) { + fd = SPIFFS_open(FS, name, SPIFFS_RDONLY, 0); + CHECK(fd >= 0); + SPIFFS_clearerr(FS); + for (i = 0; i < size * 2; i += j) { + u8_t dst; + res = SPIFFS_read(FS, fd, buf, j); + TEST_CHECK_EQ(SPIFFS_errno(FS), i < size ? SPIFFS_OK : SPIFFS_ERR_END_OF_OBJECT); + TEST_CHECK_EQ(res, MIN(j, MAX(0, size - (i + j) + j))); + } + SPIFFS_close(FS, fd); + } + + return TEST_RES_OK; +} +TEST_END + TEST(bad_index_1) { int size = SPIFFS_DATA_PAGE_SIZE(FS)*3; @@ -2410,6 +2452,7 @@ SUITE_TESTS(hydrogen_tests) ADD_TEST(read_chunk_index) ADD_TEST(read_chunk_huge) ADD_TEST(read_beyond) + ADD_TEST(read_beyond2) ADD_TEST(bad_index_1) ADD_TEST(bad_index_2) ADD_TEST(lseek_simple_modification) diff --git a/src/test/test_spiffs.c b/src/test/test_spiffs.c index 49157c8..8d72463 100644 --- a/src/test/test_spiffs.c +++ b/src/test/test_spiffs.c @@ -841,10 +841,10 @@ u32_t get_spiffs_file_crc_by_fd(spiffs_file fd) { ASSERT(SPIFFS_lseek(FS, fd, 0, SPIFFS_SEEK_SET) >= 0, "could not seek to start of file"); - while ((res = SPIFFS_read(FS, fd, buf, sizeof(buf))) >= SPIFFS_OK) { + while ((res = SPIFFS_read(FS, fd, buf, sizeof(buf))) > SPIFFS_OK) { crc = crc32(crc, buf, res); } - ASSERT(res == SPIFFS_ERR_END_OF_OBJECT || res == SPIFFS_OK, "failed reading file"); + ASSERT(SPIFFS_errno(FS) == SPIFFS_ERR_END_OF_OBJECT || SPIFFS_errno(FS) == SPIFFS_OK, "failed reading file"); return crc; }