Skip to content

Commit 011c110

Browse files
committed
sanity check image, block, page size arguments
Should help with issues like: - #43 - pellepl/spiffs#207
1 parent 112d653 commit 011c110

File tree

1 file changed

+61
-7
lines changed

1 file changed

+61
-7
lines changed

main.cpp

+61-7
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,8 @@ static s32_t api_spiffs_erase(u32_t addr, u32_t size)
7171
return SPIFFS_OK;
7272
}
7373

74-
74+
static int checkArgs();
75+
static size_t getFileSize(FILE* fp);
7576

7677

7778
//implementation
@@ -147,9 +148,7 @@ int addFile(char* name, const char* path)
147148
spiffs_file dst = SPIFFS_open(&s_fs, name, SPIFFS_CREAT | SPIFFS_TRUNC | SPIFFS_RDWR, 0);
148149

149150
// read file size
150-
fseek(src, 0, SEEK_END);
151-
size_t size = ftell(src);
152-
fseek(src, 0, SEEK_SET);
151+
size_t size = getFileSize(src);
153152

154153
if (s_debugLevel > 0) {
155154
std::cout << "file size: " << size << std::endl;
@@ -468,6 +467,14 @@ int actionPack()
468467

469468
if (s_imageSize == 0) {
470469
s_imageSize = 0x10000;
470+
if (s_debugLevel > 0) {
471+
std::cout << "image size not specifed, using default: " << s_imageSize << std::endl;
472+
}
473+
}
474+
475+
int err = checkArgs();
476+
if (err != 0) {
477+
return err;
471478
}
472479

473480
s_flashmem.resize(s_imageSize, 0xff);
@@ -488,7 +495,7 @@ int actionPack()
488495
return result;
489496
}
490497

491-
size_t getFileSize(FILE* fp)
498+
static size_t getFileSize(FILE* fp)
492499
{
493500
fseek(fp, 0L, SEEK_END);
494501
size_t size = (size_t) ftell(fp);
@@ -517,6 +524,11 @@ int actionUnpack(void)
517524
s_imageSize = getFileSize(fdsrc);
518525
}
519526

527+
int err = checkArgs();
528+
if (err != 0) {
529+
return err;
530+
}
531+
520532
s_flashmem.resize(s_imageSize, 0xff);
521533

522534
// read content into s_flashmem
@@ -555,6 +567,11 @@ int actionList()
555567
s_imageSize = getFileSize(fdsrc);
556568
}
557569

570+
int err = checkArgs();
571+
if (err != 0) {
572+
return err;
573+
}
574+
558575
s_flashmem.resize(s_imageSize, 0xff);
559576

560577
fread(&s_flashmem[0], 4, s_flashmem.size() / 4, fdsrc);
@@ -582,6 +599,11 @@ int actionVisualize()
582599
s_imageSize = getFileSize(fdsrc);
583600
}
584601

602+
int err = checkArgs();
603+
if (err != 0) {
604+
return err;
605+
}
606+
585607
s_flashmem.resize(s_imageSize, 0xff);
586608

587609

@@ -660,7 +682,7 @@ void processArgs(int argc, const char** argv)
660682
cmd.parse( argc, argv );
661683

662684
if (debugArg.getValue() > 0) {
663-
std::cout << "Debug output enabled" << std::endl;
685+
std::cerr << "Debug output enabled" << std::endl;
664686
s_debugLevel = debugArg.getValue();
665687
}
666688

@@ -683,13 +705,45 @@ void processArgs(int argc, const char** argv)
683705
s_addAllFiles = addAllFilesArg.isSet();
684706
}
685707

708+
static int checkArgs()
709+
{
710+
// Argument checks don't use TCLAP's Constraint interface because
711+
// a) we need to check one argument against another, while Constraints only check
712+
// each argument individually, and b) image size might only be known when image
713+
// file is opened.
714+
715+
if (s_imageSize < 0 || s_pageSize < 0 || s_blockSize < 0) {
716+
std::cerr << "error: Image, block, page sizes should not be negative" << std::endl;
717+
return 1;
718+
}
719+
720+
if (s_imageSize % s_blockSize != 0) {
721+
std::cerr << "error: Image size should be a multiple of block size" << std::endl;
722+
return 1;
723+
}
724+
725+
if (s_blockSize % s_pageSize != 0) {
726+
std::cerr << "error: Block size should be a multiple of page size" << std::endl;
727+
return 1;
728+
}
729+
730+
const int physicalFlashEraseBlockSize = 4096;
731+
if (s_blockSize % physicalFlashEraseBlockSize != 0) {
732+
std::cerr << "error: Block size should be multiple of flash erase block size (" <<
733+
physicalFlashEraseBlockSize << ")" << std::endl;
734+
return 1;
735+
}
736+
737+
return 0;
738+
}
739+
686740
int main(int argc, const char * argv[])
687741
{
688742

689743
try {
690744
processArgs(argc, argv);
691745
} catch (...) {
692-
std::cerr << "Invalid arguments" << std::endl;
746+
std::cerr << "error: Invalid arguments" << std::endl;
693747
return 1;
694748
}
695749

0 commit comments

Comments
 (0)