diff --git a/source/fs/mufs/path.c b/source/fs/mufs/path.c index 8d59ecf..462813d 100644 --- a/source/fs/mufs/path.c +++ b/source/fs/mufs/path.c @@ -95,9 +95,12 @@ int mufs_rmpath(struct mufs *fs, const char *path) struct flash_dev *dev = fs->dev; char data[1 << dev->log2_block_size]; struct mufs_dentry *entry, *next; + struct mufs_dirent ent; struct mufs_tree *tree; + struct mufs_dir *dir; char *s, *name; uint32_t va, offset, len; + int ret; if (!(s = mufs_abspath(path))) return -1; @@ -105,13 +108,24 @@ int mufs_rmpath(struct mufs *fs, const char *path) name = strrchr(s, '/'); *name++ = '\0'; - if (!(tree = resolve_path(fs, s, NULL))) { - free(s); - return -1; + if (!(tree = resolve_path(fs, s, NULL))) + goto err_free_s; + + if (!(dir = mufs_opendir(fs, s))) + goto err_free_s; + + for (va = dir->va; (ret = mufs_readdir(dir, &ent)) == 0; va = dir->va) { + if (strcmp(ent.path, name) == 0) + break; } - offset = tree->va & ((UINT32_C(1) << dev->log2_block_size) - 1); - va = align(tree->va, dev->log2_block_size); + mufs_closedir(dir); + + if (ret < 0) + goto err_free_s; + + 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) return -1; @@ -130,7 +144,12 @@ int mufs_rmpath(struct mufs *fs, const char *path) if (mufs_tree_write(tree, data, va, 1 << dev->log2_block_size) == 0) return -1; + free(s); return 0; + +err_free_s: + free(s); + return -1; } int mufs_stat(struct mufs *fs, const char *path, struct mufs_stat *stat)