@@ -304,7 +304,7 @@ static int lfs_dir_alloc(lfs_t *lfs, lfs_dir_t *dir) {
304
304
305
305
// set defaults
306
306
dir -> d .rev += 1 ;
307
- dir -> d .size = sizeof (dir -> d );
307
+ dir -> d .size = sizeof (dir -> d )+ 4 ;
308
308
dir -> d .tail [0 ] = -1 ;
309
309
dir -> d .tail [1 ] = -1 ;
310
310
dir -> off = sizeof (dir -> d );
@@ -331,17 +331,21 @@ static int lfs_dir_fetch(lfs_t *lfs,
331
331
continue ;
332
332
}
333
333
334
+ if ((0x7fffffff & test .size ) > lfs -> cfg -> block_size ) {
335
+ continue ;
336
+ }
337
+
334
338
uint32_t crc = 0xffffffff ;
335
339
crc = lfs_crc (crc , & test , sizeof (test ));
336
340
337
- for (lfs_off_t j = sizeof (test ); j < lfs -> cfg -> block_size ; j += 4 ) {
338
- uint32_t word ;
339
- int err = lfs_read (lfs , tpair [i ], j , & word , 4 );
341
+ for (lfs_off_t j = sizeof (test ); j < ( 0x7fffffff & test . size ) ; j ++ ) {
342
+ uint8_t data ;
343
+ int err = lfs_read (lfs , tpair [i ], j , & data , 1 );
340
344
if (err ) {
341
345
return err ;
342
346
}
343
347
344
- crc = lfs_crc (crc , & word , 4 );
348
+ crc = lfs_crc (crc , & data , 1 );
345
349
}
346
350
347
351
if (crc != 0 ) {
@@ -405,8 +409,7 @@ static int lfs_dir_commit(lfs_t *lfs, lfs_dir_t *dir,
405
409
int i = 0 ;
406
410
lfs_off_t oldoff = sizeof (dir -> d );
407
411
lfs_off_t newoff = sizeof (dir -> d );
408
- lfs_size_t newsize = 0x7fffffff & dir -> d .size ;
409
- while (newoff < newsize ) {
412
+ while (newoff < (0x7fffffff & dir -> d .size )- 4 ) {
410
413
if (i < count && regions [i ].oldoff == oldoff ) {
411
414
crc = lfs_crc (crc , regions [i ].newdata , regions [i ].newlen );
412
415
int err = lfs_prog (lfs , dir -> pair [0 ],
@@ -442,21 +445,7 @@ static int lfs_dir_commit(lfs_t *lfs, lfs_dir_t *dir,
442
445
}
443
446
}
444
447
445
- while (newoff < lfs -> cfg -> block_size - 4 ) {
446
- uint8_t data = 0xff ;
447
- crc = lfs_crc (crc , & data , 1 );
448
- err = lfs_prog (lfs , dir -> pair [0 ], newoff , & data , 1 );
449
- if (err ) {
450
- if (err == LFS_ERR_CORRUPT ) {
451
- goto relocate ;
452
- }
453
- return err ;
454
- }
455
-
456
- newoff += 1 ;
457
- }
458
-
459
- err = lfs_prog (lfs , dir -> pair [0 ], lfs -> cfg -> block_size - 4 , & crc , 4 );
448
+ err = lfs_prog (lfs , dir -> pair [0 ], newoff , & crc , 4 );
460
449
if (err ) {
461
450
if (err == LFS_ERR_CORRUPT ) {
462
451
goto relocate ;
@@ -514,8 +503,8 @@ static int lfs_dir_append(lfs_t *lfs, lfs_dir_t *dir,
514
503
lfs_entry_t * entry , const void * data ) {
515
504
// check if we fit, if top bit is set we do not and move on
516
505
while (true) {
517
- if (dir -> d .size + entry -> d .len <= lfs -> cfg -> block_size - 4 ) {
518
- entry -> off = dir -> d .size ;
506
+ if (dir -> d .size + entry -> d .len <= lfs -> cfg -> block_size ) {
507
+ entry -> off = dir -> d .size - 4 ;
519
508
return lfs_dir_commit (lfs , dir , (struct lfs_region []){
520
509
{entry -> off , 0 , & entry -> d , sizeof (entry -> d )},
521
510
{entry -> off , 0 , data , entry -> d .len - sizeof (entry -> d )}
@@ -532,7 +521,7 @@ static int lfs_dir_append(lfs_t *lfs, lfs_dir_t *dir,
532
521
533
522
newdir .d .tail [0 ] = dir -> d .tail [0 ];
534
523
newdir .d .tail [1 ] = dir -> d .tail [1 ];
535
- entry -> off = newdir .d .size ;
524
+ entry -> off = newdir .d .size - 4 ;
536
525
err = lfs_dir_commit (lfs , & newdir , (struct lfs_region []){
537
526
{entry -> off , 0 , & entry -> d , sizeof (entry -> d )},
538
527
{entry -> off , 0 , data , entry -> d .len - sizeof (entry -> d )}
@@ -556,7 +545,7 @@ static int lfs_dir_append(lfs_t *lfs, lfs_dir_t *dir,
556
545
557
546
static int lfs_dir_remove (lfs_t * lfs , lfs_dir_t * dir , lfs_entry_t * entry ) {
558
547
// either shift out the one entry or remove the whole dir block
559
- if (dir -> d .size == sizeof (dir -> d )) {
548
+ if (dir -> d .size == sizeof (dir -> d )+ 4 ) {
560
549
lfs_dir_t pdir ;
561
550
int res = lfs_pred (lfs , dir -> pair , & pdir );
562
551
if (res < 0 ) {
@@ -580,7 +569,7 @@ static int lfs_dir_remove(lfs_t *lfs, lfs_dir_t *dir, lfs_entry_t *entry) {
580
569
}
581
570
582
571
static int lfs_dir_next (lfs_t * lfs , lfs_dir_t * dir , lfs_entry_t * entry ) {
583
- while (dir -> off + sizeof (entry -> d ) > (0x7fffffff & dir -> d .size )) {
572
+ while (dir -> off + sizeof (entry -> d ) > (0x7fffffff & dir -> d .size )- 4 ) {
584
573
if (!(0x80000000 & dir -> d .size )) {
585
574
entry -> off = dir -> off ;
586
575
return LFS_ERR_NOENT ;
@@ -592,7 +581,7 @@ static int lfs_dir_next(lfs_t *lfs, lfs_dir_t *dir, lfs_entry_t *entry) {
592
581
}
593
582
594
583
dir -> off = sizeof (dir -> d );
595
- dir -> pos += sizeof (dir -> d );
584
+ dir -> pos += sizeof (dir -> d ) + 4 ;
596
585
}
597
586
598
587
int err = lfs_read (lfs , dir -> pair [0 ], dir -> off ,
@@ -1483,7 +1472,7 @@ int lfs_remove(lfs_t *lfs, const char *path) {
1483
1472
int err = lfs_dir_fetch (lfs , & dir , entry .d .u .dir );
1484
1473
if (err ) {
1485
1474
return err ;
1486
- } else if (dir .d .size != sizeof (dir .d )) {
1475
+ } else if (dir .d .size != sizeof (dir .d )+ 4 ) {
1487
1476
return LFS_ERR_INVAL ;
1488
1477
}
1489
1478
}
@@ -1559,7 +1548,7 @@ int lfs_rename(lfs_t *lfs, const char *oldpath, const char *newpath) {
1559
1548
int err = lfs_dir_fetch (lfs , & dir , preventry .d .u .dir );
1560
1549
if (err ) {
1561
1550
return err ;
1562
- } else if (dir .d .size != sizeof (dir .d )) {
1551
+ } else if (dir .d .size != sizeof (dir .d )+ 4 ) {
1563
1552
return LFS_ERR_INVAL ;
1564
1553
}
1565
1554
}
@@ -1733,7 +1722,7 @@ int lfs_format(lfs_t *lfs, const struct lfs_config *cfg) {
1733
1722
};
1734
1723
superdir .d .tail [0 ] = root .pair [0 ];
1735
1724
superdir .d .tail [1 ] = root .pair [1 ];
1736
- superdir .d .size = sizeof (superdir .d ) + sizeof (superblock .d );
1725
+ superdir .d .size = sizeof (superdir .d ) + sizeof (superblock .d ) + 4 ;
1737
1726
1738
1727
// write both pairs to be safe
1739
1728
bool valid = false;
@@ -1832,7 +1821,7 @@ int lfs_traverse(lfs_t *lfs, int (*cb)(void*, lfs_block_t), void *data) {
1832
1821
}
1833
1822
1834
1823
// iterate over contents
1835
- while (( 0x7fffffff & dir . d . size ) >= dir . off + sizeof ( entry . d ) ) {
1824
+ while (dir . off + sizeof ( entry . d ) <= ( 0x7fffffff & dir . d . size ) - 4 ) {
1836
1825
int err = lfs_read (lfs , dir .pair [0 ], dir .off ,
1837
1826
& entry .d , sizeof (entry .d ));
1838
1827
if (err ) {
0 commit comments