mirror of
				https://github.com/eledio-devices/thirdparty-littlefs.git
				synced 2025-10-31 08:42:40 +01:00 
			
		
		
		
	Removed toolchain specific warnings
- Comparisons with differently signed integer types - Incorrectly signed constant - Unreachable default returns - Leaked uninitialized variables in relocate goto statements
This commit is contained in:
		
							
								
								
									
										282
									
								
								lfs.c
									
									
									
									
									
								
							
							
						
						
									
										282
									
								
								lfs.c
									
									
									
									
									
								
							| @@ -373,8 +373,8 @@ static int lfs_dir_alloc(lfs_t *lfs, lfs_dir_t *dir) { | |||||||
|     // set defaults |     // set defaults | ||||||
|     dir->d.rev += 1; |     dir->d.rev += 1; | ||||||
|     dir->d.size = sizeof(dir->d)+4; |     dir->d.size = sizeof(dir->d)+4; | ||||||
|     dir->d.tail[0] = -1; |     dir->d.tail[0] = 0xffffffff; | ||||||
|     dir->d.tail[1] = -1; |     dir->d.tail[1] = 0xffffffff; | ||||||
|     dir->off = sizeof(dir->d); |     dir->off = sizeof(dir->d); | ||||||
|  |  | ||||||
|     // don't write out yet, let caller take care of that |     // don't write out yet, let caller take care of that | ||||||
| @@ -455,88 +455,91 @@ static int lfs_dir_commit(lfs_t *lfs, lfs_dir_t *dir, | |||||||
|     bool relocated = false; |     bool relocated = false; | ||||||
|  |  | ||||||
|     while (true) { |     while (true) { | ||||||
|         int err = lfs_bd_erase(lfs, dir->pair[0]); |         if (true) { | ||||||
|         if (err) { |             int err = lfs_bd_erase(lfs, dir->pair[0]); | ||||||
|             if (err == LFS_ERR_CORRUPT) { |             if (err) { | ||||||
|                 goto relocate; |                 if (err == LFS_ERR_CORRUPT) { | ||||||
|  |                     goto relocate; | ||||||
|  |                 } | ||||||
|  |                 return err; | ||||||
|             } |             } | ||||||
|             return err; |  | ||||||
|         } |  | ||||||
|  |  | ||||||
|         uint32_t crc = 0xffffffff; |             uint32_t crc = 0xffffffff; | ||||||
|         lfs_crc(&crc, &dir->d, sizeof(dir->d)); |             lfs_crc(&crc, &dir->d, sizeof(dir->d)); | ||||||
|         err = lfs_bd_prog(lfs, dir->pair[0], 0, &dir->d, sizeof(dir->d)); |             err = lfs_bd_prog(lfs, dir->pair[0], 0, &dir->d, sizeof(dir->d)); | ||||||
|         if (err) { |             if (err) { | ||||||
|             if (err == LFS_ERR_CORRUPT) { |                 if (err == LFS_ERR_CORRUPT) { | ||||||
|                 goto relocate; |                     goto relocate; | ||||||
|  |                 } | ||||||
|  |                 return err; | ||||||
|             } |             } | ||||||
|             return err; |  | ||||||
|         } |  | ||||||
|  |  | ||||||
|         int i = 0; |             int i = 0; | ||||||
|         lfs_off_t oldoff = sizeof(dir->d); |             lfs_off_t oldoff = sizeof(dir->d); | ||||||
|         lfs_off_t newoff = sizeof(dir->d); |             lfs_off_t newoff = sizeof(dir->d); | ||||||
|         while (newoff < (0x7fffffff & dir->d.size)-4) { |             while (newoff < (0x7fffffff & dir->d.size)-4) { | ||||||
|             if (i < count && regions[i].oldoff == oldoff) { |                 if (i < count && regions[i].oldoff == oldoff) { | ||||||
|                 lfs_crc(&crc, regions[i].newdata, regions[i].newlen); |                     lfs_crc(&crc, regions[i].newdata, regions[i].newlen); | ||||||
|                 int err = lfs_bd_prog(lfs, dir->pair[0], |                     int err = lfs_bd_prog(lfs, dir->pair[0], | ||||||
|                         newoff, regions[i].newdata, regions[i].newlen); |                             newoff, regions[i].newdata, regions[i].newlen); | ||||||
|                 if (err) { |                     if (err) { | ||||||
|                     if (err == LFS_ERR_CORRUPT) { |                         if (err == LFS_ERR_CORRUPT) { | ||||||
|                         goto relocate; |                             goto relocate; | ||||||
|  |                         } | ||||||
|  |                         return err; | ||||||
|                     } |                     } | ||||||
|                     return err; |  | ||||||
|                 } |  | ||||||
|  |  | ||||||
|                 oldoff += regions[i].oldlen; |                     oldoff += regions[i].oldlen; | ||||||
|                 newoff += regions[i].newlen; |                     newoff += regions[i].newlen; | ||||||
|                 i += 1; |                     i += 1; | ||||||
|             } else { |                 } else { | ||||||
|                 uint8_t data; |                     uint8_t data; | ||||||
|                 int err = lfs_bd_read(lfs, oldpair[1], oldoff, &data, 1); |                     int err = lfs_bd_read(lfs, oldpair[1], oldoff, &data, 1); | ||||||
|                 if (err) { |                     if (err) { | ||||||
|                     return err; |                         return err; | ||||||
|                 } |  | ||||||
|  |  | ||||||
|                 lfs_crc(&crc, &data, 1); |  | ||||||
|                 err = lfs_bd_prog(lfs, dir->pair[0], newoff, &data, 1); |  | ||||||
|                 if (err) { |  | ||||||
|                     if (err == LFS_ERR_CORRUPT) { |  | ||||||
|                         goto relocate; |  | ||||||
|                     } |                     } | ||||||
|                     return err; |  | ||||||
|  |                     lfs_crc(&crc, &data, 1); | ||||||
|  |                     err = lfs_bd_prog(lfs, dir->pair[0], newoff, &data, 1); | ||||||
|  |                     if (err) { | ||||||
|  |                         if (err == LFS_ERR_CORRUPT) { | ||||||
|  |                             goto relocate; | ||||||
|  |                         } | ||||||
|  |                         return err; | ||||||
|  |                     } | ||||||
|  |  | ||||||
|  |                     oldoff += 1; | ||||||
|  |                     newoff += 1; | ||||||
|                 } |                 } | ||||||
|  |  | ||||||
|                 oldoff += 1; |  | ||||||
|                 newoff += 1; |  | ||||||
|             } |             } | ||||||
|         } |  | ||||||
|  |  | ||||||
|         err = lfs_bd_prog(lfs, dir->pair[0], newoff, &crc, 4); |             err = lfs_bd_prog(lfs, dir->pair[0], newoff, &crc, 4); | ||||||
|         if (err) { |             if (err) { | ||||||
|             if (err == LFS_ERR_CORRUPT) { |                 if (err == LFS_ERR_CORRUPT) { | ||||||
|                 goto relocate; |                     goto relocate; | ||||||
|  |                 } | ||||||
|  |                 return err; | ||||||
|             } |             } | ||||||
|             return err; |  | ||||||
|         } |  | ||||||
|  |  | ||||||
|         err = lfs_bd_sync(lfs); |             err = lfs_bd_sync(lfs); | ||||||
|         if (err) { |             if (err) { | ||||||
|             if (err == LFS_ERR_CORRUPT) { |                 if (err == LFS_ERR_CORRUPT) { | ||||||
|                 goto relocate; |                     goto relocate; | ||||||
|  |                 } | ||||||
|  |                 return err; | ||||||
|             } |             } | ||||||
|             return err; |  | ||||||
|         } |  | ||||||
|  |  | ||||||
|         // successful commit, check checksum to make sure |             // successful commit, check checksum to make sure | ||||||
|         crc = 0xffffffff; |             crc = 0xffffffff; | ||||||
|         err = lfs_bd_crc(lfs, dir->pair[0], 0, 0x7fffffff & dir->d.size, &crc); |             err = lfs_bd_crc(lfs, dir->pair[0], 0, | ||||||
|         if (err) { |                     0x7fffffff & dir->d.size, &crc); | ||||||
|             return err; |             if (err) { | ||||||
|         } |                 return err; | ||||||
|  |             } | ||||||
|  |  | ||||||
|         if (crc == 0) { |             if (crc == 0) { | ||||||
|             break; |                 break; | ||||||
|  |             } | ||||||
|         } |         } | ||||||
|  |  | ||||||
| relocate: | relocate: | ||||||
| @@ -554,7 +557,7 @@ relocate: | |||||||
|         } |         } | ||||||
|  |  | ||||||
|         // relocate half of pair |         // relocate half of pair | ||||||
|         err = lfs_alloc(lfs, &dir->pair[0]); |         int err = lfs_alloc(lfs, &dir->pair[0]); | ||||||
|         if (err) { |         if (err) { | ||||||
|             return err; |             return err; | ||||||
|         } |         } | ||||||
| @@ -791,8 +794,6 @@ static int lfs_dir_find(lfs_t *lfs, lfs_dir_t *dir, | |||||||
|             return err; |             return err; | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     return 0; |  | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| @@ -1021,7 +1022,7 @@ static int lfs_ctz_find(lfs_t *lfs, | |||||||
|         lfs_block_t head, lfs_size_t size, |         lfs_block_t head, lfs_size_t size, | ||||||
|         lfs_size_t pos, lfs_block_t *block, lfs_off_t *off) { |         lfs_size_t pos, lfs_block_t *block, lfs_off_t *off) { | ||||||
|     if (size == 0) { |     if (size == 0) { | ||||||
|         *block = -1; |         *block = 0xffffffff; | ||||||
|         *off = 0; |         *off = 0; | ||||||
|         return 0; |         return 0; | ||||||
|     } |     } | ||||||
| @@ -1053,59 +1054,15 @@ static int lfs_ctz_extend(lfs_t *lfs, | |||||||
|         lfs_block_t head, lfs_size_t size, |         lfs_block_t head, lfs_size_t size, | ||||||
|         lfs_off_t *block, lfs_block_t *off) { |         lfs_off_t *block, lfs_block_t *off) { | ||||||
|     while (true) { |     while (true) { | ||||||
|         // go ahead and grab a block |         if (true) { | ||||||
|         int err = lfs_alloc(lfs, block); |             // go ahead and grab a block | ||||||
|         if (err) { |             int err = lfs_alloc(lfs, block); | ||||||
|             return err; |             if (err) { | ||||||
|         } |                 return err; | ||||||
|         assert(*block >= 2 && *block <= lfs->cfg->block_count); |  | ||||||
|  |  | ||||||
|         err = lfs_bd_erase(lfs, *block); |  | ||||||
|         if (err) { |  | ||||||
|             if (err == LFS_ERR_CORRUPT) { |  | ||||||
|                 goto relocate; |  | ||||||
|             } |             } | ||||||
|             return err; |             assert(*block >= 2 && *block <= lfs->cfg->block_count); | ||||||
|         } |  | ||||||
|  |  | ||||||
|         if (size == 0) { |             err = lfs_bd_erase(lfs, *block); | ||||||
|             *off = 0; |  | ||||||
|             return 0; |  | ||||||
|         } |  | ||||||
|  |  | ||||||
|         size -= 1; |  | ||||||
|         lfs_off_t index = lfs_ctz_index(lfs, &size); |  | ||||||
|         size += 1; |  | ||||||
|  |  | ||||||
|         // just copy out the last block if it is incomplete |  | ||||||
|         if (size != lfs->cfg->block_size) { |  | ||||||
|             for (lfs_off_t i = 0; i < size; i++) { |  | ||||||
|                 uint8_t data; |  | ||||||
|                 int err = lfs_cache_read(lfs, rcache, NULL, head, i, &data, 1); |  | ||||||
|                 if (err) { |  | ||||||
|                     return err; |  | ||||||
|                 } |  | ||||||
|  |  | ||||||
|                 err = lfs_cache_prog(lfs, pcache, rcache, *block, i, &data, 1); |  | ||||||
|                 if (err) { |  | ||||||
|                     if (err == LFS_ERR_CORRUPT) { |  | ||||||
|                         goto relocate; |  | ||||||
|                     } |  | ||||||
|                     return err; |  | ||||||
|                 } |  | ||||||
|             } |  | ||||||
|  |  | ||||||
|             *off = size; |  | ||||||
|             return 0; |  | ||||||
|         } |  | ||||||
|  |  | ||||||
|         // append block |  | ||||||
|         index += 1; |  | ||||||
|         lfs_size_t skips = lfs_ctz(index) + 1; |  | ||||||
|  |  | ||||||
|         for (lfs_off_t i = 0; i < skips; i++) { |  | ||||||
|             int err = lfs_cache_prog(lfs, pcache, rcache, |  | ||||||
|                     *block, 4*i, &head, 4); |  | ||||||
|             if (err) { |             if (err) { | ||||||
|                 if (err == LFS_ERR_CORRUPT) { |                 if (err == LFS_ERR_CORRUPT) { | ||||||
|                     goto relocate; |                     goto relocate; | ||||||
| @@ -1113,18 +1070,67 @@ static int lfs_ctz_extend(lfs_t *lfs, | |||||||
|                 return err; |                 return err; | ||||||
|             } |             } | ||||||
|  |  | ||||||
|             if (i != skips-1) { |             if (size == 0) { | ||||||
|                 err = lfs_cache_read(lfs, rcache, NULL, head, 4*i, &head, 4); |                 *off = 0; | ||||||
|                 if (err) { |                 return 0; | ||||||
|                     return err; |  | ||||||
|                 } |  | ||||||
|             } |             } | ||||||
|  |  | ||||||
|             assert(head >= 2 && head <= lfs->cfg->block_count); |             size -= 1; | ||||||
|         } |             lfs_off_t index = lfs_ctz_index(lfs, &size); | ||||||
|  |             size += 1; | ||||||
|  |  | ||||||
|         *off = 4*skips; |             // just copy out the last block if it is incomplete | ||||||
|         return 0; |             if (size != lfs->cfg->block_size) { | ||||||
|  |                 for (lfs_off_t i = 0; i < size; i++) { | ||||||
|  |                     uint8_t data; | ||||||
|  |                     int err = lfs_cache_read(lfs, rcache, NULL, | ||||||
|  |                             head, i, &data, 1); | ||||||
|  |                     if (err) { | ||||||
|  |                         return err; | ||||||
|  |                     } | ||||||
|  |  | ||||||
|  |                     err = lfs_cache_prog(lfs, pcache, rcache, | ||||||
|  |                             *block, i, &data, 1); | ||||||
|  |                     if (err) { | ||||||
|  |                         if (err == LFS_ERR_CORRUPT) { | ||||||
|  |                             goto relocate; | ||||||
|  |                         } | ||||||
|  |                         return err; | ||||||
|  |                     } | ||||||
|  |                 } | ||||||
|  |  | ||||||
|  |                 *off = size; | ||||||
|  |                 return 0; | ||||||
|  |             } | ||||||
|  |  | ||||||
|  |             // append block | ||||||
|  |             index += 1; | ||||||
|  |             lfs_size_t skips = lfs_ctz(index) + 1; | ||||||
|  |  | ||||||
|  |             for (lfs_off_t i = 0; i < skips; i++) { | ||||||
|  |                 int err = lfs_cache_prog(lfs, pcache, rcache, | ||||||
|  |                         *block, 4*i, &head, 4); | ||||||
|  |                 if (err) { | ||||||
|  |                     if (err == LFS_ERR_CORRUPT) { | ||||||
|  |                         goto relocate; | ||||||
|  |                     } | ||||||
|  |                     return err; | ||||||
|  |                 } | ||||||
|  |  | ||||||
|  |                 if (i != skips-1) { | ||||||
|  |                     err = lfs_cache_read(lfs, rcache, NULL, | ||||||
|  |                             head, 4*i, &head, 4); | ||||||
|  |                     if (err) { | ||||||
|  |                         return err; | ||||||
|  |                     } | ||||||
|  |                 } | ||||||
|  |  | ||||||
|  |                 assert(head >= 2 && head <= lfs->cfg->block_count); | ||||||
|  |             } | ||||||
|  |  | ||||||
|  |             *off = 4*skips; | ||||||
|  |             return 0; | ||||||
|  |         } | ||||||
|  |  | ||||||
| relocate: | relocate: | ||||||
|         LFS_DEBUG("Bad block at %d", *block); |         LFS_DEBUG("Bad block at %d", *block); | ||||||
| @@ -1161,8 +1167,6 @@ static int lfs_ctz_traverse(lfs_t *lfs, | |||||||
|  |  | ||||||
|         index -= 1; |         index -= 1; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     return 0; |  | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| @@ -1200,7 +1204,7 @@ int lfs_file_open(lfs_t *lfs, lfs_file_t *file, | |||||||
|         entry.d.elen = sizeof(entry.d) - 4; |         entry.d.elen = sizeof(entry.d) - 4; | ||||||
|         entry.d.alen = 0; |         entry.d.alen = 0; | ||||||
|         entry.d.nlen = strlen(path); |         entry.d.nlen = strlen(path); | ||||||
|         entry.d.u.file.head = -1; |         entry.d.u.file.head = 0xffffffff; | ||||||
|         entry.d.u.file.size = 0; |         entry.d.u.file.size = 0; | ||||||
|         err = lfs_dir_append(lfs, &cwd, &entry, path); |         err = lfs_dir_append(lfs, &cwd, &entry, path); | ||||||
|         if (err) { |         if (err) { | ||||||
| @@ -1222,7 +1226,7 @@ int lfs_file_open(lfs_t *lfs, lfs_file_t *file, | |||||||
|     file->pos = 0; |     file->pos = 0; | ||||||
|  |  | ||||||
|     if (flags & LFS_O_TRUNC) { |     if (flags & LFS_O_TRUNC) { | ||||||
|         file->head = -1; |         file->head = 0xffffffff; | ||||||
|         file->size = 0; |         file->size = 0; | ||||||
|     } |     } | ||||||
|  |  | ||||||
| @@ -1589,13 +1593,13 @@ lfs_soff_t lfs_file_seek(lfs_t *lfs, lfs_file_t *file, | |||||||
|     if (whence == LFS_SEEK_SET) { |     if (whence == LFS_SEEK_SET) { | ||||||
|         file->pos = off; |         file->pos = off; | ||||||
|     } else if (whence == LFS_SEEK_CUR) { |     } else if (whence == LFS_SEEK_CUR) { | ||||||
|         if (-off > file->pos) { |         if ((lfs_off_t)-off > file->pos) { | ||||||
|             return LFS_ERR_INVAL; |             return LFS_ERR_INVAL; | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         file->pos = file->pos + off; |         file->pos = file->pos + off; | ||||||
|     } else if (whence == LFS_SEEK_END) { |     } else if (whence == LFS_SEEK_END) { | ||||||
|         if (-off > file->size) { |         if ((lfs_off_t)-off > file->size) { | ||||||
|             return LFS_ERR_INVAL; |             return LFS_ERR_INVAL; | ||||||
|         } |         } | ||||||
|  |  | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user