From abebd91725f5f66fe5ddccff5af12a7d0d2dd1f8 Mon Sep 17 00:00:00 2001 From: Xiang Xiao Date: Wed, 20 Jan 2021 21:31:09 +0800 Subject: [PATCH] fs/tmpfs: Iterate the entry reversely in readdir MIRTOS-342 to avoid readdir return the wrong entry in the following code: void rmdir_recursive(FAR const char *path) { FAR DIR *dir = opendir(path); while (1) { char fullpath[MAX_PATH]; FAR dirent *ent = readdir(dir); if (ent == NULL) { break; } sprintf(fullpath, "%s/%s", path, ent->d_name); if (DIRENT_ISDIRECTORY(ent->d_type)) { rmdir_recursive(fullpath); } else { unlink(fullpath); } } } Signed-off-by: Xiang Xiao Change-Id: Ide60fe8db6aada88ad3d8e45367f11599a6f33b1 --- fs/tmpfs/fs_tmpfs.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/fs/tmpfs/fs_tmpfs.c b/fs/tmpfs/fs_tmpfs.c index 518424098f0..38ed4353a32 100644 --- a/fs/tmpfs/fs_tmpfs.c +++ b/fs/tmpfs/fs_tmpfs.c @@ -1962,7 +1962,7 @@ static int tmpfs_opendir(FAR struct inode *mountpt, FAR const char *relpath, if (ret >= 0) { dir->u.tmpfs.tf_tdo = tdo; - dir->u.tmpfs.tf_index = 0; + dir->u.tmpfs.tf_index = tdo->tdo_nentries; tmpfs_unlock_directory(tdo); } @@ -2022,7 +2022,7 @@ static int tmpfs_readdir(FAR struct inode *mountpt, /* Have we reached the end of the directory? */ index = dir->u.tmpfs.tf_index; - if (index >= tdo->tdo_nentries) + if (index-- == 0) { /* We signal the end of the directory by returning the special error: * -ENOENT @@ -2059,9 +2059,9 @@ static int tmpfs_readdir(FAR struct inode *mountpt, strncpy(dir->fd_dir.d_name, tde->tde_name, NAME_MAX); - /* Increment the index for next time */ + /* Save the index for next time */ - dir->u.tmpfs.tf_index = index + 1; + dir->u.tmpfs.tf_index = index; ret = OK; } @@ -2079,9 +2079,9 @@ static int tmpfs_rewinddir(FAR struct inode *mountpt, finfo("mountpt: %p dir: %p\n", mountpt, dir); DEBUGASSERT(mountpt != NULL && dir != NULL); - /* Set the readdir index to zero */ + /* Set the readdir index pass the end */ - dir->u.tmpfs.tf_index = 0; + dir->u.tmpfs.tf_index = tdo->tdo_nentries; return OK; }