mirror of
				https://github.com/eledio-devices/thirdparty-littlefs.git
				synced 2025-11-01 00:38:29 +01:00 
			
		
		
		
	WIP fixed bug with globals poisoning from dirs
Needs to be cleaned up
This commit is contained in:
		
							
								
								
									
										18
									
								
								lfs.c
									
									
									
									
									
								
							
							
						
						
									
										18
									
								
								lfs.c
									
									
									
									
									
								
							| @@ -664,6 +664,13 @@ static int lfs_commit_movescan(lfs_t *lfs, void *p, lfs_mattr_t attr) { | |||||||
|         return 0; |         return 0; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  |     // TODO AHHHH, scopes, what about user scope above? | ||||||
|  |     if (lfs_tag_scope(attr.tag) == LFS_SCOPE_FS || | ||||||
|  |             lfs_tag_scope(attr.tag) == LFS_SCOPE_DIR) { | ||||||
|  |         // ignore non-matching ids | ||||||
|  |         return 0; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     if (lfs_tag_id(attr.tag) != move->id.from) { |     if (lfs_tag_id(attr.tag) != move->id.from) { | ||||||
|         // ignore non-matching ids |         // ignore non-matching ids | ||||||
|         return 0; |         return 0; | ||||||
| @@ -1023,6 +1030,9 @@ static int lfs_dir_compact(lfs_t *lfs, lfs_mdir_t *dir, lfs_mattrlist_t *list, | |||||||
|  |  | ||||||
|     // There's nothing special about our global delta, so feed it back |     // There's nothing special about our global delta, so feed it back | ||||||
|     // into the global global delta |     // into the global global delta | ||||||
|  |     // TODO IMMENSE HMM globals get bleed into from above, need to be fixed after commits due to potential moves | ||||||
|  |     lfs_globals_t gtemp = dir->globals; // TODO hmm, why did we have different variables then? | ||||||
|  |  | ||||||
|     lfs->diff = lfs_globals_xor(&lfs->diff, &dir->globals); |     lfs->diff = lfs_globals_xor(&lfs->diff, &dir->globals); | ||||||
|     dir->globals = (lfs_globals_t){0}; |     dir->globals = (lfs_globals_t){0}; | ||||||
|  |  | ||||||
| @@ -1196,6 +1206,8 @@ relocate: | |||||||
|         lfs->diff = (lfs_globals_t){0}; |         lfs->diff = (lfs_globals_t){0}; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  |     lfs->globals = lfs_globals_xor(&lfs->globals, >emp); // TODO hmm, why did we have different variables then? | ||||||
|  |  | ||||||
|     return 0; |     return 0; | ||||||
| } | } | ||||||
|  |  | ||||||
| @@ -1244,6 +1256,8 @@ static int lfs_dir_commit(lfs_t *lfs, lfs_mdir_t *dir, lfs_mattrlist_t *list) { | |||||||
|         // successful commit, lets update dir |         // successful commit, lets update dir | ||||||
|         dir->off = commit.off; |         dir->off = commit.off; | ||||||
|         dir->etag = commit.ptag; |         dir->etag = commit.ptag; | ||||||
|  | //        // TODO hm | ||||||
|  | //        dir->globals = lfs_globals_xor(&dir->globals, &lfs->diff); | ||||||
|         lfs->globals = lfs_globals_xor(&lfs->globals, &lfs->diff); |         lfs->globals = lfs_globals_xor(&lfs->globals, &lfs->diff); | ||||||
|         lfs->diff = (lfs_globals_t){0}; |         lfs->diff = (lfs_globals_t){0}; | ||||||
|         break; |         break; | ||||||
| @@ -2954,6 +2968,10 @@ int lfs_rename(lfs_t *lfs, const char *oldpath, const char *newpath) { | |||||||
|             return res; |             return res; | ||||||
|         } |         } | ||||||
|  |  | ||||||
|  |         // TODO test for global state stealing? | ||||||
|  |         // steal global state | ||||||
|  |         lfs->globals = lfs_globals_xor(&lfs->globals, &prevdir.globals); | ||||||
|  |  | ||||||
|         LFS_ASSERT(res); // must have pred |         LFS_ASSERT(res); // must have pred | ||||||
|         newcwd.tail[0] = prevdir.tail[0]; |         newcwd.tail[0] = prevdir.tail[0]; | ||||||
|         newcwd.tail[1] = prevdir.tail[1]; |         newcwd.tail[1] = prevdir.tail[1]; | ||||||
|   | |||||||
							
								
								
									
										2
									
								
								lfs.h
									
									
									
									
									
								
							
							
						
						
									
										2
									
								
								lfs.h
									
									
									
									
									
								
							| @@ -129,7 +129,7 @@ enum lfs_type { | |||||||
|     // internal sources |     // internal sources | ||||||
|     LFS_FROM_REGION     = 0x000, |     LFS_FROM_REGION     = 0x000, | ||||||
|     LFS_FROM_DISK       = 0x200, |     LFS_FROM_DISK       = 0x200, | ||||||
|     LFS_FROM_MOVE       = 0x0ff, |     LFS_FROM_MOVE       = 0x03f, | ||||||
| }; | }; | ||||||
|  |  | ||||||
| // File open flags | // File open flags | ||||||
|   | |||||||
| @@ -109,7 +109,7 @@ tests/test.py << TEST | |||||||
| TEST | TEST | ||||||
|  |  | ||||||
| echo "--- Move file after corrupt ---" | echo "--- Move file after corrupt ---" | ||||||
| tests/test.py -s << TEST | tests/test.py << TEST | ||||||
|     lfs_mount(&lfs, &cfg) => 0; |     lfs_mount(&lfs, &cfg) => 0; | ||||||
|     lfs_rename(&lfs, "c/hello", "d/hello") => 0; |     lfs_rename(&lfs, "c/hello", "d/hello") => 0; | ||||||
|     lfs_unmount(&lfs) => 0; |     lfs_unmount(&lfs) => 0; | ||||||
| @@ -166,7 +166,7 @@ tests/test.py << TEST | |||||||
|     lfs_rename(&lfs, "b/hi", "c/hi") => 0; |     lfs_rename(&lfs, "b/hi", "c/hi") => 0; | ||||||
|     lfs_unmount(&lfs) => 0; |     lfs_unmount(&lfs) => 0; | ||||||
| TEST | TEST | ||||||
| rm -v blocks/7 | truncate -s-11 blocks/7 | ||||||
| tests/test.py << TEST | tests/test.py << TEST | ||||||
|     lfs_mount(&lfs, &cfg) => 0; |     lfs_mount(&lfs, &cfg) => 0; | ||||||
|     lfs_dir_open(&lfs, &dir[0], "b") => 0; |     lfs_dir_open(&lfs, &dir[0], "b") => 0; | ||||||
| @@ -182,8 +182,6 @@ tests/test.py << TEST | |||||||
|     lfs_dir_read(&lfs, &dir[0], &info) => 1; |     lfs_dir_read(&lfs, &dir[0], &info) => 1; | ||||||
|     strcmp(info.name, "..") => 0; |     strcmp(info.name, "..") => 0; | ||||||
|     lfs_dir_read(&lfs, &dir[0], &info) => 1; |     lfs_dir_read(&lfs, &dir[0], &info) => 1; | ||||||
|     strcmp(info.name, "hello") => 0; |  | ||||||
|     lfs_dir_read(&lfs, &dir[0], &info) => 1; |  | ||||||
|     strcmp(info.name, "hi") => 0; |     strcmp(info.name, "hi") => 0; | ||||||
|     lfs_dir_read(&lfs, &dir[0], &info) => 0; |     lfs_dir_read(&lfs, &dir[0], &info) => 0; | ||||||
|     lfs_unmount(&lfs) => 0; |     lfs_unmount(&lfs) => 0; | ||||||
| @@ -195,8 +193,8 @@ tests/test.py << TEST | |||||||
|     lfs_rename(&lfs, "c/hi", "d/hi") => 0; |     lfs_rename(&lfs, "c/hi", "d/hi") => 0; | ||||||
|     lfs_unmount(&lfs) => 0; |     lfs_unmount(&lfs) => 0; | ||||||
| TEST | TEST | ||||||
| rm -v blocks/9 | truncate -s-11 blocks/9 | ||||||
| rm -v blocks/a | truncate -s-11 blocks/b | ||||||
| tests/test.py << TEST | tests/test.py << TEST | ||||||
|     lfs_mount(&lfs, &cfg) => 0; |     lfs_mount(&lfs, &cfg) => 0; | ||||||
|     lfs_dir_open(&lfs, &dir[0], "c") => 0; |     lfs_dir_open(&lfs, &dir[0], "c") => 0; | ||||||
| @@ -205,8 +203,6 @@ tests/test.py << TEST | |||||||
|     lfs_dir_read(&lfs, &dir[0], &info) => 1; |     lfs_dir_read(&lfs, &dir[0], &info) => 1; | ||||||
|     strcmp(info.name, "..") => 0; |     strcmp(info.name, "..") => 0; | ||||||
|     lfs_dir_read(&lfs, &dir[0], &info) => 1; |     lfs_dir_read(&lfs, &dir[0], &info) => 1; | ||||||
|     strcmp(info.name, "hello") => 0; |  | ||||||
|     lfs_dir_read(&lfs, &dir[0], &info) => 1; |  | ||||||
|     strcmp(info.name, "hi") => 0; |     strcmp(info.name, "hi") => 0; | ||||||
|     lfs_dir_read(&lfs, &dir[0], &info) => 0; |     lfs_dir_read(&lfs, &dir[0], &info) => 0; | ||||||
|     lfs_dir_close(&lfs, &dir[0]) => 0; |     lfs_dir_close(&lfs, &dir[0]) => 0; | ||||||
| @@ -215,6 +211,36 @@ tests/test.py << TEST | |||||||
|     strcmp(info.name, ".") => 0; |     strcmp(info.name, ".") => 0; | ||||||
|     lfs_dir_read(&lfs, &dir[0], &info) => 1; |     lfs_dir_read(&lfs, &dir[0], &info) => 1; | ||||||
|     strcmp(info.name, "..") => 0; |     strcmp(info.name, "..") => 0; | ||||||
|  |     lfs_dir_read(&lfs, &dir[0], &info) => 1; | ||||||
|  |     strcmp(info.name, "hello") => 0; | ||||||
|  |     lfs_dir_read(&lfs, &dir[0], &info) => 0; | ||||||
|  |     lfs_unmount(&lfs) => 0; | ||||||
|  | TEST | ||||||
|  |  | ||||||
|  | echo "--- Move dir after corrupt ---" | ||||||
|  | tests/test.py << TEST | ||||||
|  |     lfs_mount(&lfs, &cfg) => 0; | ||||||
|  |     lfs_rename(&lfs, "c/hi", "d/hi") => 0; | ||||||
|  |     lfs_unmount(&lfs) => 0; | ||||||
|  | TEST | ||||||
|  | tests/test.py << TEST | ||||||
|  |     lfs_mount(&lfs, &cfg) => 0; | ||||||
|  |     lfs_dir_open(&lfs, &dir[0], "c") => 0; | ||||||
|  |     lfs_dir_read(&lfs, &dir[0], &info) => 1; | ||||||
|  |     strcmp(info.name, ".") => 0; | ||||||
|  |     lfs_dir_read(&lfs, &dir[0], &info) => 1; | ||||||
|  |     strcmp(info.name, "..") => 0; | ||||||
|  |     lfs_dir_read(&lfs, &dir[0], &info) => 0; | ||||||
|  |     lfs_dir_close(&lfs, &dir[0]) => 0; | ||||||
|  |     lfs_dir_open(&lfs, &dir[0], "d") => 0; | ||||||
|  |     lfs_dir_read(&lfs, &dir[0], &info) => 1; | ||||||
|  |     strcmp(info.name, ".") => 0; | ||||||
|  |     lfs_dir_read(&lfs, &dir[0], &info) => 1; | ||||||
|  |     strcmp(info.name, "..") => 0; | ||||||
|  |     lfs_dir_read(&lfs, &dir[0], &info) => 1; | ||||||
|  |     strcmp(info.name, "hello") => 0; | ||||||
|  |     lfs_dir_read(&lfs, &dir[0], &info) => 1; | ||||||
|  |     strcmp(info.name, "hi") => 0; | ||||||
|     lfs_dir_read(&lfs, &dir[0], &info) => 0; |     lfs_dir_read(&lfs, &dir[0], &info) => 0; | ||||||
|     lfs_unmount(&lfs) => 0; |     lfs_unmount(&lfs) => 0; | ||||||
| TEST | TEST | ||||||
| @@ -225,9 +251,9 @@ tests/test.py << TEST | |||||||
|  |  | ||||||
|     lfs_dir_open(&lfs, &dir[0], "a/hi") => LFS_ERR_NOENT; |     lfs_dir_open(&lfs, &dir[0], "a/hi") => LFS_ERR_NOENT; | ||||||
|     lfs_dir_open(&lfs, &dir[0], "b/hi") => LFS_ERR_NOENT; |     lfs_dir_open(&lfs, &dir[0], "b/hi") => LFS_ERR_NOENT; | ||||||
|     lfs_dir_open(&lfs, &dir[0], "d/hi") => LFS_ERR_NOENT; |     lfs_dir_open(&lfs, &dir[0], "c/hi") => LFS_ERR_NOENT; | ||||||
|  |  | ||||||
|     lfs_dir_open(&lfs, &dir[0], "c/hi") => 0; |     lfs_dir_open(&lfs, &dir[0], "d/hi") => 0; | ||||||
|     lfs_dir_read(&lfs, &dir[0], &info) => 1; |     lfs_dir_read(&lfs, &dir[0], &info) => 1; | ||||||
|     strcmp(info.name, ".") => 0; |     strcmp(info.name, ".") => 0; | ||||||
|     lfs_dir_read(&lfs, &dir[0], &info) => 1; |     lfs_dir_read(&lfs, &dir[0], &info) => 1; | ||||||
| @@ -243,9 +269,9 @@ tests/test.py << TEST | |||||||
|  |  | ||||||
|     lfs_dir_open(&lfs, &dir[0], "a/hello") => LFS_ERR_NOENT; |     lfs_dir_open(&lfs, &dir[0], "a/hello") => LFS_ERR_NOENT; | ||||||
|     lfs_dir_open(&lfs, &dir[0], "b/hello") => LFS_ERR_NOENT; |     lfs_dir_open(&lfs, &dir[0], "b/hello") => LFS_ERR_NOENT; | ||||||
|     lfs_dir_open(&lfs, &dir[0], "d/hello") => LFS_ERR_NOENT; |     lfs_dir_open(&lfs, &dir[0], "c/hello") => LFS_ERR_NOENT; | ||||||
|  |  | ||||||
|     lfs_file_open(&lfs, &file[0], "c/hello", LFS_O_RDONLY) => 0; |     lfs_file_open(&lfs, &file[0], "d/hello", LFS_O_RDONLY) => 0; | ||||||
|     lfs_file_read(&lfs, &file[0], buffer, 5) => 5; |     lfs_file_read(&lfs, &file[0], buffer, 5) => 5; | ||||||
|     memcmp(buffer, "hola\n", 5) => 0; |     memcmp(buffer, "hola\n", 5) => 0; | ||||||
|     lfs_file_read(&lfs, &file[0], buffer, 8) => 8; |     lfs_file_read(&lfs, &file[0], buffer, 8) => 8; | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user