@@ -30,9 +30,14 @@ Connector to let httpd use the espfs filesystem to serve the files in it.
3030
3131#include "roffsformat.h"
3232
33+ // default filesystem size in flash
34+ #define FLASH_FILESYSTEM_SIZE_1M (128*1024)
35+ #define FLASH_FILESYSTEM_SIZE_2M (1*1024*1024)
36+ #define FLASH_FILESYSTEM_SIZE_4M (3*1024*1024)
37+
3338// default filesystem base address in flash
34- #define FLASH_FILESYSTEM_BASE_1M (512*1024 - 128*1024 )
35- #define FLASH_FILESYSTEM_BASE_2M (1024*1024)
39+ #define FLASH_FILESYSTEM_BASE_1M (512*1024-FLASH_FILESYSTEM_SIZE_1M )
40+ #define FLASH_FILESYSTEM_BASE_2M_4M (1024*1024)
3641
3742// open file structure
3843struct ROFFS_FILE_STRUCT {
@@ -48,30 +53,41 @@ struct ROFFS_FILE_STRUCT {
4853
4954// initialize to an invalid address to indicate that no filesystem is mounted
5055static uint32_t fsData = BAD_FILESYSTEM_BASE ;
56+ static uint32_t fsSize = 0 ;
57+ static uint32_t fsTop = 0 ;
5158
5259static int readFlash (uint32_t addr , void * buf , int size );
5360static int writeFlash (uint32_t addr , void * buf , int size );
5461static int updateFlash (uint32_t addr , void * buf , int size );
5562
56- uint32_t roffs_base_address (void )
63+ uint32_t roffs_base_address (uint32_t * pSize )
5764{
5865 uint32_t base ;
5966 switch (system_get_flash_size_map ()) {
60- case FLASH_SIZE_8M_MAP_512_512 :
67+ case FLASH_SIZE_8M_MAP_512_512 : // 1MB
6168 base = FLASH_FILESYSTEM_BASE_1M ;
69+ * pSize = FLASH_FILESYSTEM_SIZE_1M ;
70+ os_printf ("1MB flash: base %08x, size %d\n" , base , * pSize );
71+ break ;
72+ case FLASH_SIZE_16M_MAP_512_512 : // 2MB
73+ base = FLASH_FILESYSTEM_BASE_2M_4M ;
74+ * pSize = FLASH_FILESYSTEM_SIZE_2M ;
75+ os_printf ("2MB flash: base %08x, size %d\n" , base , * pSize );
6276 break ;
63- case FLASH_SIZE_16M_MAP_512_512 :
64- case FLASH_SIZE_32M_MAP_512_512 :
65- base = FLASH_FILESYSTEM_BASE_2M ;
77+ case FLASH_SIZE_32M_MAP_512_512 : // 4MB
78+ base = FLASH_FILESYSTEM_BASE_2M_4M ;
79+ * pSize = FLASH_FILESYSTEM_SIZE_4M ;
80+ os_printf ("4MB flash: base %08x, size %d\n" , base , * pSize );
6681 break ;
6782 default :
6883 base = 0 ;
84+ os_printf ("Unknown flash size\n" );
6985 break ;
7086 }
7187 return base ;
7288}
7389
74- int ICACHE_FLASH_ATTR roffs_mount (uint32_t flashAddress )
90+ int ICACHE_FLASH_ATTR roffs_mount (uint32_t flashAddress , uint32_t flashSize )
7591{
7692 RoFsHeader testHeader ;
7793
@@ -91,8 +107,11 @@ int ICACHE_FLASH_ATTR roffs_mount(uint32_t flashAddress)
91107 return -3 ;
92108
93109 // filesystem is mounted successfully
94- DBG ("mount: flash filesystem mounted at %08x\n" , flashAddress );
110+ DBG ("mount: flash filesystem mounted at %08x, size %d \n" , flashAddress , flashSize );
95111 fsData = flashAddress ;
112+ fsSize = flashSize ;
113+ fsTop = fsData + fsSize ;
114+
96115 return 0 ;
97116}
98117
@@ -509,6 +528,11 @@ DBG("create: can't find insertion point\n");
509528 return NULL ;
510529 }
511530
531+ if (insertionOffset + 2 * sizeof (RoFsHeader ) > fsTop ) {
532+ DBG ("write: insufficient space\n" );
533+ return NULL ;
534+ }
535+
512536 if (!(file = (ROFFS_FILE * )os_malloc (sizeof (ROFFS_FILE )))) {
513537DBG ("create: insufficient memory\n" );
514538 return NULL ;
@@ -559,6 +583,10 @@ DBG("create: error reading new file name\n");
559583int ICACHE_FLASH_ATTR roffs_write (ROFFS_FILE * file , char * buf , int len )
560584{
561585 int roundedLen = (len + 3 ) & ~3 ;
586+ if (file -> start + file -> size + roundedLen > fsTop ) {
587+ DBG ("write: insufficient space\n" );
588+ return -1 ;
589+ }
562590 if (writeFlash (file -> start + file -> size , (uint32 * )buf , roundedLen ) != SPI_FLASH_RESULT_OK ) {
563591DBG ("write: error writing to file\n" );
564592 return -1 ;
0 commit comments