You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@nuttx.apache.org by ac...@apache.org on 2021/01/21 18:07:09 UTC

[incubator-nuttx] branch master updated: fs/tmpfs: Iterate the entry reversely in readdir

This is an automated email from the ASF dual-hosted git repository.

acassis pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-nuttx.git


The following commit(s) were added to refs/heads/master by this push:
     new b33d967  fs/tmpfs: Iterate the entry reversely in readdir
b33d967 is described below

commit b33d967548ec795a3ba5ac29f7a697555b595ab2
Author: Xiang Xiao <xi...@xiaomi.com>
AuthorDate: Wed Jan 20 21:31:09 2021 +0800

    fs/tmpfs: Iterate the entry reversely in readdir
    
    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 <xi...@xiaomi.com>
    Change-Id: Ide60fe8db6aada88ad3d8e45367f11599a6f33b1
---
 fs/tmpfs/fs_tmpfs.c | 19 +++++++++++++------
 1 file changed, 13 insertions(+), 6 deletions(-)

diff --git a/fs/tmpfs/fs_tmpfs.c b/fs/tmpfs/fs_tmpfs.c
index 8568262..c9cf528 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 + 1);
 
-      /* 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;
     }
 
@@ -2076,12 +2076,19 @@ static int tmpfs_readdir(FAR struct inode *mountpt,
 static int tmpfs_rewinddir(FAR struct inode *mountpt,
                            FAR struct fs_dirent_s *dir)
 {
+  FAR struct tmpfs_directory_s *tdo;
+
   finfo("mountpt: %p dir: %p\n",  mountpt, dir);
   DEBUGASSERT(mountpt != NULL && dir != NULL);
 
-  /* Set the readdir index to zero */
+  /* Get the directory structure from the dir argument and lock it */
+
+  tdo = dir->u.tmpfs.tf_tdo;
+  DEBUGASSERT(tdo != NULL);
+
+  /* Set the readdir index pass the end */
 
-  dir->u.tmpfs.tf_index = 0;
+  dir->u.tmpfs.tf_index = tdo->tdo_nentries;
   return OK;
 }