diff --git a/src/spiffs_hydrogen.c b/src/spiffs_hydrogen.c index 5ca0e04..235aaaa 100644 --- a/src/spiffs_hydrogen.c +++ b/src/spiffs_hydrogen.c @@ -481,7 +481,6 @@ s32_t SPIFFS_write(spiffs *fs, spiffs_file fh, void *buf, s32_t len) { if ((fd->flags & SPIFFS_O_APPEND)) { fd->fdoffset = fd->size == SPIFFS_UNDEFINED_LEN ? 0 : fd->size; } - offset = fd->fdoffset; #if SPIFFS_CACHE_WR diff --git a/src/spiffs_nucleus.c b/src/spiffs_nucleus.c index f2eda25..27ecdff 100644 --- a/src/spiffs_nucleus.c +++ b/src/spiffs_nucleus.c @@ -1061,12 +1061,18 @@ void spiffs_cb_object_event( #if SPIFFS_TEMPORAL_FD_CACHE if (cur_fd->score == 0) continue; // never used fd #endif - SPIFFS_DBG(" callback: setting fd "_SPIPRIfd":"_SPIPRIid"(fdoffs:"_SPIPRIi" offs:"_SPIPRIi") objix_hdr_pix to "_SPIPRIpg", size:"_SPIPRIi"\n", SPIFFS_FH_OFFS(fs, cur_fd->file_nbr), cur_fd->obj_id, cur_fd->fdoffset, cur_fd->offset, new_pix, new_size); + SPIFFS_DBG(" callback: setting fd "_SPIPRIfd":"_SPIPRIid"(fdoffs:"_SPIPRIi" offs:"_SPIPRIi") objix_hdr_pix to "_SPIPRIpg", size:"_SPIPRIi"\n", + SPIFFS_FH_OFFS(fs, cur_fd->file_nbr), cur_fd->obj_id, cur_fd->fdoffset, cur_fd->offset, new_pix, new_size); cur_fd->objix_hdr_pix = new_pix; if (new_size != 0) { // update size and offsets for fds to this file cur_fd->size = new_size; u32_t act_new_size = new_size == SPIFFS_UNDEFINED_LEN ? 0 : new_size; +#if SPIFFS_CACHE_WR + if (act_new_size > 0 && cur_fd->cache_page) { + act_new_size = MAX(act_new_size, cur_fd->cache_page->offset + cur_fd->cache_page->size); + } +#endif if (cur_fd->offset > act_new_size) { cur_fd->offset = act_new_size; } diff --git a/src/test/test_bugreports.c b/src/test/test_bugreports.c index 3dd4cd8..e9b59d1 100644 --- a/src/test/test_bugreports.c +++ b/src/test/test_bugreports.c @@ -1199,6 +1199,37 @@ TEST(remove_release_fd_152) { return TEST_RES_OK; } TEST_END +TEST(certain_file_size_fail_165) { + fs_reset_specific(0, 0, 512*1024, 4*1024, 64*1024, 256); + const int NUM = 134; + const int SIZ = 200; + u8_t buf[SIZ]; + + TEST_CHECK_EQ(SPIFFS_creat(FS, "test", 0), SPIFFS_OK); + spiffs_file fd = SPIFFS_open(FS, "test", SPIFFS_O_CREAT | SPIFFS_O_WRONLY, 0); + TEST_CHECK_GT(fd, 0); + + int i; + for (i = 0; i < NUM; i++) { + TEST_CHECK_EQ(SPIFFS_write(FS, fd, buf, SIZ), SIZ); + } + TEST_CHECK_EQ(SPIFFS_close(FS, fd), SPIFFS_OK); + fd = SPIFFS_open(FS, "test", SPIFFS_O_RDONLY, 0); + TEST_CHECK_GT(fd, 0); + + spiffs_stat s; + TEST_CHECK_EQ(SPIFFS_fstat(FS, fd, &s), SPIFFS_OK); + TEST_CHECK_EQ(s.size, NUM*SIZ); + + int size = 0; + for (i = 0; i < NUM; i++) { + size += SPIFFS_read(FS, fd, buf, SIZ); + } + TEST_CHECK_EQ(size, NUM*SIZ); + + return TEST_RES_OK; +} TEST_END + SUITE_TESTS(bug_tests) ADD_TEST(nodemcu_full_fs_1) @@ -1221,6 +1252,7 @@ SUITE_TESTS(bug_tests) ADD_TEST(fuzzer_found_3) ADD_TEST(fuzzer_found_4) ADD_TEST(remove_release_fd_152) + ADD_TEST(certain_file_size_fail_165) ADD_TEST_NON_DEFAULT(fuzzer_found_single_1) ADD_TEST_NON_DEFAULT(log_afl_test) ADD_TEST_NON_DEFAULT(afl_test) diff --git a/src/test/test_spiffs.c b/src/test/test_spiffs.c index c7152b5..aa60866 100644 --- a/src/test/test_spiffs.c +++ b/src/test/test_spiffs.c @@ -645,6 +645,14 @@ int read_and_verify_fd(spiffs_file fd, char *name) { printf(" read_and_verify: could not stat file %s\n", name); return res; } + + off_t fsize = lseek(pfd, 0, SEEK_END); + if (s.size != fsize) { + printf(" read_and_verify: size differs, %s spiffs:%d!=fs:%ld\n", name, s.size, fsize); + return -1; + } + lseek(pfd, 0, SEEK_SET); + if (s.size == 0) { SPIFFS_close(&__fs, fd); close(pfd);