diff --git a/source/fs/mufs/dir.c b/source/fs/mufs/dir.c index e36fd63..4441dd8 100644 --- a/source/fs/mufs/dir.c +++ b/source/fs/mufs/dir.c @@ -270,9 +270,12 @@ size_t write_dirent(struct mufs_tree *tree, { struct mufs *fs = tree->fs; struct flash_dev *dev = fs->dev; - char data[1 << dev->log2_block_size]; struct mufs_dentry entry; - size_t size; + size_t 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); entry.type = dirent->type; entry.tree.file_size = dirent->tree.file_size; @@ -280,15 +283,18 @@ size_t write_dirent(struct mufs_tree *tree, entry.tree.depth = dirent->tree.depth; entry.path_len = strlen(dirent->path); - memcpy(data, &entry, sizeof entry); - memcpy(data + sizeof entry, dirent->path, entry.path_len); - size = sizeof entry + entry.path_len; + if (block_size - offset < sizeof entry + entry.path_len) + return 0; + + if (mufs_tree_write(tree, dirent->path, va + offset + sizeof entry, + entry.path_len) == 0) + return 0; - if (mufs_tree_write(tree, data, va, size) == 0) + if (mufs_tree_write(tree, &entry, va + offset, sizeof entry) == 0) return 0; - va += sizeof entry + entry.path_len; - tree->file_size = max(tree->file_size, va); + tree->file_size = max(tree->file_size, va + offset + sizeof entry + + entry.path_len); if (tree->file_size <= va && mufs_sync_tree(tree) < 0) return 0;