Prevented multiple opens of the same file

This commit is contained in:
philip
2017-04-22 19:28:08 -04:00
parent a6d535e67f
commit 724a1d478f
2 changed files with 76 additions and 10 deletions
+72 -8
View File
@@ -612,6 +612,8 @@ static int run_fuzz_test(FILE *f, int maxfds, int debuglog) {
spiffs_file fd[4];
memset(fd, -1, sizeof(fd));
int openindex[4];
memset(openindex, -1, sizeof(openindex));
char *filename[8];
int i;
@@ -645,14 +647,33 @@ static int run_fuzz_test(FILE *f, int maxfds, int debuglog) {
break;
}
int fdn = ((arg >> 6) & 3) % maxfds;
int rc;
switch(c) {
case 'O':
if (fd[fdn] >= 0) {
LOGOP(" close(%d)\n", fd[fdn]);
SPIFFS_close(FS, fd[fdn]);
openindex[fdn] = -1;
fd[fdn] = -1;
}
#ifndef HAVE_MULTIPLE_OPEN
{
int index = (arg >> 3) & 7;
for (i = 0; i < sizeof(openindex) / sizeof(openindex[0]); i++) {
if (openindex[i] == index) {
break;
}
}
if (i < sizeof(openindex) / sizeof(openindex[0])) {
break;
}
}
#endif
LOGOP(" open(\"%s\", 0x%x)", filename[(arg>>3) & 7], modes[arg & 7]);
fd[fdn] = SPIFFS_open(FS, filename[(arg>>3) & 7], modes[arg & 7], 0);
if (fd[fdn] >= 0) {
openindex[fdn] = (arg >> 3) & 7;
}
LOGOP(" -> %d\n", fd[fdn]);
break;
@@ -679,7 +700,7 @@ static int run_fuzz_test(FILE *f, int maxfds, int debuglog) {
case 'W':
if (fd[fdn] >= 0) {
LOGOP(" write(%d, , %d)", fd[fdn], (15 << (arg & 7)) + (arg & 127));
int rc = SPIFFS_write(FS, fd[fdn], buff, (15 << (arg & 7)) + (arg & 127));
rc = SPIFFS_write(FS, fd[fdn], buff, (15 << (arg & 7)) + (arg & 127));
LOGOP(" -> %d\n", rc);
}
break;
@@ -690,6 +711,7 @@ static int run_fuzz_test(FILE *f, int maxfds, int debuglog) {
SPIFFS_close(FS, fd[fdn]);
}
fd[fdn] = -1;
openindex[fdn] = -1;
break;
case 'b':
@@ -706,21 +728,51 @@ static int run_fuzz_test(FILE *f, int maxfds, int debuglog) {
}
break;
#ifdef HAVE_REMOVE_OPEN
case 'D':
if (fd[fdn] >= 0) {
LOGOP(" fremove(%d)\n", fd[fdn]);
SPIFFS_fremove(FS, fd[fdn]);
}
break;
#endif
case 'd':
LOGOP(" remove(\"%s\")\n", filename[arg & 7]);
SPIFFS_remove(FS, filename[arg & 7]);
#ifndef HAVE_REMOVE_OPEN
{
int index = arg & 7;
for (i = 0; i < sizeof(openindex) / sizeof(openindex[0]); i++) {
if (openindex[i] == index) {
break;
}
}
if (i < sizeof(openindex) / sizeof(openindex[0])) {
break;
}
}
#endif
LOGOP(" remove(\"%s\")", filename[arg & 7]);
rc = SPIFFS_remove(FS, filename[arg & 7]);
LOGOP(" -> %d\n", rc);
break;
case 'r':
LOGOP(" rename(\"%s\", \"%s\")\n", filename[arg & 7], filename[(arg >> 3) & 7]);
SPIFFS_rename(FS, filename[arg & 7], filename[(arg >> 3) & 7]);
#ifndef HAVE_REMOVE_OPEN
{
int index = arg & 7;
for (i = 0; i < sizeof(openindex) / sizeof(openindex[0]); i++) {
if (openindex[i] == index) {
break;
}
}
if (i < sizeof(openindex) / sizeof(openindex[0])) {
break;
}
}
#endif
LOGOP(" rename(\"%s\", \"%s\")", filename[arg & 7], filename[(arg >> 3) & 7]);
rc = SPIFFS_rename(FS, filename[arg & 7], filename[(arg >> 3) & 7]);
LOGOP(" -> %d\n", rc);
break;
case 'U':
@@ -729,21 +781,33 @@ static int run_fuzz_test(FILE *f, int maxfds, int debuglog) {
fd[i] = -1;
}
{
#ifdef DO_UNMOUNT
LOGOP(" unmount\n");
SPIFFS_unmount(FS);
#endif
char *tmpfile = strdup("/tmp/fsdump.XXXXXX");
LOGOP(" unmount and remount\n");
LOGOP(" cycle and remount\n");
close(mkstemp(tmpfile));
fs_store_dump(tmpfile);
fs_mount_dump(tmpfile, 0, 0, blocks * block_size, erase_size, block_size, page_size);
unlink(tmpfile);
free(tmpfile);
#ifndef NO_FORCE_CHECK
LOGOP(" forcecheck()");
rc = SPIFFS_check(FS);
LOGOP(" -> %d\n", rc);
#endif
}
break;
case 'c':
LOGOP(" check()\n");
SPIFFS_check(FS);
{
LOGOP(" check()");
rc = SPIFFS_check(FS);
LOGOP(" -> %d\n", rc);
ungetc(arg, f);
break;
}
default:
ungetc(arg, f);
+4 -2
View File
@@ -218,8 +218,8 @@ static s32_t _write(
for (i = 0; i < size; i++) {
if (((addr + i) & (SPIFFS_CFG_LOG_PAGE_SZ(&__fs)-1)) != offsetof(spiffs_page_header, flags)) {
if (check_valid_flash && ((AREA(addr + i) ^ src[i]) & src[i])) {
printf("trying to write %02x to %02x at addr %08x\n", src[i], AREA(addr + i), addr+i);
spiffs_page_ix pix = (addr + i) / LOG_PAGE;
printf("trying to write %02x to %02x at addr %08x (as part of writing %d bytes to addr %08x)\n", src[i], AREA(addr + i), addr+i, size, addr);
spiffs_page_ix pix = (addr + i) / SPIFFS_CFG_LOG_PAGE_SZ(&__fs);
dump_page(&__fs, pix);
ERREXIT();
return -1;
@@ -492,10 +492,12 @@ static void fs_create(u32_t spiflash_size,
ASSERT(_fds != NULL, "testbench fd buffer could not be malloced");
memset(_fds, 0, _fds_sz);
#if SPIFFS_CACHE
_cache_sz = sizeof(spiffs_cache) + cache_pages * (sizeof(spiffs_cache_page) + log_page_size);
_cache = malloc(_cache_sz);
ASSERT(_cache != NULL, "testbench cache could not be malloced");
memset(_cache, 0, _cache_sz);
#endif
const u32_t work_sz = log_page_size * 2;
_work = malloc(work_sz);