|
|
|
@ -225,31 +225,32 @@ size_t read_dirent(struct mufs *fs, struct mufs_tree *tree, |
|
|
|
|
struct mufs_dirent *dirent, uint32_t va) |
|
|
|
|
{ |
|
|
|
|
struct flash_dev *dev = fs->dev; |
|
|
|
|
char data[1 << dev->log2_block_size]; |
|
|
|
|
struct mufs_dentry *entry; |
|
|
|
|
struct mufs_dentry entry; |
|
|
|
|
size_t len, block_size = 1 << dev->log2_block_size; |
|
|
|
|
uint32_t offset; |
|
|
|
|
|
|
|
|
|
offset = va & ((UINT32_C(1) << dev->log2_block_size) - 1); |
|
|
|
|
va = align(va, dev->log2_block_size); |
|
|
|
|
|
|
|
|
|
if (mufs_tree_read(tree, data, va, 1 << dev->log2_block_size) == 0) |
|
|
|
|
if (block_size - offset < sizeof entry) |
|
|
|
|
return 0; |
|
|
|
|
|
|
|
|
|
if (offset + sizeof *entry > (UINT32_C(1) << dev->log2_block_size)) |
|
|
|
|
if (mufs_tree_read(tree, &entry, va + offset, sizeof entry) == 0) |
|
|
|
|
return 0; |
|
|
|
|
|
|
|
|
|
entry = (struct mufs_dentry *)(data + offset); |
|
|
|
|
|
|
|
|
|
if (!entry->type) |
|
|
|
|
if (!entry.type) |
|
|
|
|
return 0; |
|
|
|
|
|
|
|
|
|
if (offset + sizeof *entry + entry->path_len > |
|
|
|
|
(UINT32_C(1) << dev->log2_block_size)) |
|
|
|
|
if (block_size - offset < sizeof entry + entry.path_len) |
|
|
|
|
return 0; |
|
|
|
|
|
|
|
|
|
memcpy(dirent->path, data + offset + sizeof *entry, entry->path_len); |
|
|
|
|
dirent->path[entry->path_len] = '\0'; |
|
|
|
|
dirent->type = entry->type; |
|
|
|
|
len = min(entry.path_len, sizeof dirent->path - 1); |
|
|
|
|
|
|
|
|
|
if (mufs_tree_read(tree, dirent->path, va + offset + sizeof entry, |
|
|
|
|
len) == 0) |
|
|
|
|
return 0; |
|
|
|
|
dirent->path[len] = '\0'; |
|
|
|
|
dirent->type = entry.type; |
|
|
|
|
|
|
|
|
|
if (mufs_lookup_page(tree, &dirent->tree.va, va) < 0) |
|
|
|
|
return 0; |
|
|
|
@ -257,11 +258,11 @@ size_t read_dirent(struct mufs *fs, struct mufs_tree *tree, |
|
|
|
|
dirent->tree.fs = fs; |
|
|
|
|
dirent->tree.va = (dirent->tree.va << dev->log2_block_size) + offset + |
|
|
|
|
offsetof(struct mufs_dentry, tree); |
|
|
|
|
dirent->tree.file_size = entry->tree.file_size; |
|
|
|
|
dirent->tree.root = entry->tree.root; |
|
|
|
|
dirent->tree.depth = entry->tree.depth; |
|
|
|
|
dirent->tree.file_size = entry.tree.file_size; |
|
|
|
|
dirent->tree.root = entry.tree.root; |
|
|
|
|
dirent->tree.depth = entry.tree.depth; |
|
|
|
|
|
|
|
|
|
return sizeof *entry + entry->path_len; |
|
|
|
|
return sizeof entry + entry.path_len; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
size_t write_dirent(struct mufs_tree *tree, |
|
|
|
|