Skip to main content
Visitor II
June 21, 2024
Solved

LittleFS dir fetch unexpected values in test parameter. STM32

  • June 21, 2024
  • 1 reply
  • 1023 views

Hello everyone, 

I am using an STM32 microcontroller and I am facing a problem when I try to mount an external flash memory. The problem is inside the function lfs_dir_fetch which is returning unexpected values in the test buffer here: 

 

struct lfs_disk_dir test;
int err = lfs_bd_read(lfs, tpair[i], 0, &test, sizeof(test));
lfs_dir_fromle32(&test);

 

the returned values are: 

 

Invalid size: test.size = 335610112, block_size = 40960
Invalid size: test.size = 335610112, block_size = 40960
lfs error:495: Corrupted dir pair at 0 1
lfs error:2214: Invalid superblock at 0 1
 	(*)Error in mounting external flash memory

 

I have successfully communicate with the external flash, since I am able to read its manufacture ID. I have also configured properly the littlefs function and I test them by writing raw data to the external flash and I was able to receive them correctly. I cannot understand what is the test variable that is being declared and why I cannot proceed to the the calculation of the crc parameter since it has a continue statement inside the problematic block:

 

static int lfs_dir_fetch(lfs_t *lfs,
 lfs_dir_t *dir, const lfs_block_t pair[2]) {
 // copy out pair, otherwise may be aliasing dir
 const lfs_block_t tpair[2] = {pair[0], pair[1]};
 bool valid = false;

 // check both blocks for the most recent revision
 for (int i = 0; i < 2; i++) {
 struct lfs_disk_dir test;
 int err = lfs_bd_read(lfs, tpair[i], 0, &test, sizeof(test));
 lfs_dir_fromle32(&test);
 if (err) {
 if (err == LFS_ERR_CORRUPT) {
 continue;
 }
 return err;
 }

 if (valid && lfs_scmp(test.rev, dir->d.rev) < 0) {
 continue;
 }

 if ((0x7fffffff & test.size) < sizeof(test)+4 ||
 (0x7fffffff & test.size) > lfs->cfg->block_size) {
 	printf("Invalid size: test.size = %ld, block_size = %ld\n",
 	 (0x7fffffff & test.size), lfs->cfg->block_size);
 continue;
 }

 uint32_t crc = 0xffffffff;
 lfs_dir_tole32(&test);
 lfs_crc(&crc, &test, sizeof(test));
 lfs_dir_fromle32(&test);
 err = lfs_bd_crc(lfs, tpair[i], sizeof(test),
 (0x7fffffff & test.size) - sizeof(test), &crc);
 if (err) {
 if (err == LFS_ERR_CORRUPT) {
 continue;
 }
 return err;
 }

 if (crc != 0) {
 continue;
 }

 valid = true;

 // setup dir in case it's valid
 dir->pair[0] = tpair[(i+0) % 2];
 dir->pair[1] = tpair[(i+1) % 2];
 dir->off = sizeof(dir->d);
 dir->d = test;
 }

 if (!valid) {
 LFS_ERROR("Corrupted dir pair at %" PRIu32 " %" PRIu32 ,
 tpair[0], tpair[1]);
 return LFS_ERR_CORRUPT;
 }

 return 0;
}

 

    This topic has been closed for replies.
    Best answer by Tesla DeLorean

    Explicitly clear local/auto variables otherwise they will contain random stack junk.

    int arrayfoo[100] = {0};

    1 reply

    Graduate II
    June 21, 2024

    Explicitly clear local/auto variables otherwise they will contain random stack junk.

    int arrayfoo[100] = {0};

    Visitor II
    November 7, 2025

    Thanks @Tesla DeLorean, that was the issue.
    Initializing the variable fixed the problem.

     
     
    struct lfs_disk_dir test = {0};