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/07/18 13:26:06 UTC

[incubator-nuttx] 01/02: fs/tmpfs: Handle the tail '/' correctly

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

commit 7053707e0a9a0e9ed4c55708ccb6d7c5a24381b0
Author: Xiang Xiao <xi...@xiaomi.com>
AuthorDate: Sat Jul 17 21:20:44 2021 +0800

    fs/tmpfs: Handle the tail '/' correctly
    
    Signed-off-by: Xiang Xiao <xi...@xiaomi.com>
    Change-Id: Ia2beeaced2de9c38afefd92a2ddc13dfb4919c45
---
 fs/tmpfs/fs_tmpfs.c | 81 ++++++++++++++++++++++++++++++++++++++++++++++++++---
 1 file changed, 77 insertions(+), 4 deletions(-)

diff --git a/fs/tmpfs/fs_tmpfs.c b/fs/tmpfs/fs_tmpfs.c
index 2fb5013..b571e84 100644
--- a/fs/tmpfs/fs_tmpfs.c
+++ b/fs/tmpfs/fs_tmpfs.c
@@ -455,6 +455,20 @@ static int tmpfs_find_dirent(FAR struct tmpfs_directory_s *tdo,
 {
   int i;
 
+  if (len == 0)
+    {
+      return -EINVAL;
+    }
+  else if (name[len - 1] == '/')
+    {
+      /* Ignore the tail '/' */
+
+      if (--len == 0)
+        {
+          return -EINVAL;
+        }
+    }
+
   /* Search the list of directory entries for a match */
 
   for (i = 0;
@@ -518,13 +532,29 @@ static int tmpfs_add_dirent(FAR struct tmpfs_directory_s *tdo,
   FAR struct tmpfs_dirent_s *tde;
   FAR char *newname;
   unsigned int nentries;
+  size_t namelen;
   int index;
 
   /* Copy the name string so that it will persist as long as the
    * directory entry.
    */
 
-  newname = strdup(name);
+  namelen = strlen(name);
+  if (namelen == 0)
+    {
+      return -EINVAL;
+    }
+  else if (name[namelen - 1] == '/')
+    {
+      /* Don't copy the tail '/' */
+
+      if (--namelen == 0)
+        {
+          return -EINVAL;
+        }
+    }
+
+  newname = strndup(name, namelen);
   if (newname == NULL)
     {
       return -ENOMEM;
@@ -623,7 +653,7 @@ static int tmpfs_create_file(FAR struct tmpfs_s *fs,
 
       parent->tdo_refs++;
     }
-  else
+  else if (name[1] != '\0')
     {
       /* Locate the parent directory that should contain this name.
        * On success, tmpfs_find_directory() will lock the parent
@@ -640,6 +670,10 @@ static int tmpfs_create_file(FAR struct tmpfs_s *fs,
 
       name++;
     }
+  else
+    {
+      return -EISDIR;
+    }
 
   /* Verify that no object of this name already exists in the directory */
 
@@ -748,6 +782,13 @@ static int tmpfs_create_directory(FAR struct tmpfs_s *fs,
    */
 
   name = strrchr(relpath, '/');
+  if (name && name[1] == '\0')
+    {
+      /* Ignore the tail '/' */
+
+      name = memrchr(relpath, '/', name - relpath);
+    }
+
   if (name == NULL)
     {
       /* No subdirectories... use the root directory */
@@ -909,7 +950,7 @@ static int tmpfs_find_object(FAR struct tmpfs_s *fs,
         {
           /* No.  Was this the final segment in the path? */
 
-          if (len == 0)
+          if (len == 0 && *next_segment != '/')
             {
               /* Then we can break out of the loop now */
 
@@ -992,14 +1033,25 @@ static int tmpfs_find_file(FAR struct tmpfs_s *fs,
                            FAR struct tmpfs_directory_s **parent)
 {
   FAR struct tmpfs_object_s *to;
+  size_t len;
   int ret;
 
+  len = strlen(relpath);
+  if (len == 0)
+    {
+      return -EINVAL;
+    }
+  else if (relpath[len - 1] == '/')
+    {
+      return -EISDIR;
+    }
+
   /* Find the object at this path.  If successful, tmpfs_find_object() will
    * lock both the object and the parent directory and will increment the
    * reference count on both.
    */
 
-  ret = tmpfs_find_object(fs, relpath, strlen(relpath), &to, parent);
+  ret = tmpfs_find_object(fs, relpath, len, &to, parent);
   if (ret >= 0)
     {
       /* We found it... but is it a regular file? */
@@ -2362,6 +2414,13 @@ static int tmpfs_rmdir(FAR struct inode *mountpt, FAR const char *relpath)
   /* Get the directory name from the relative path */
 
   name = strrchr(relpath, '/');
+  if (name && name[1] == '\0')
+    {
+      /* Ignore the tail '/' */
+
+      name = memrchr(relpath, '/', name - relpath);
+    }
+
   if (name != NULL)
     {
       /* Skip over the fidirectoryle '/' character */
@@ -2447,6 +2506,13 @@ static int tmpfs_rename(FAR struct inode *mountpt,
    */
 
   newname = strrchr(newrelpath, '/');
+  if (newname && newname[1] == '\0')
+    {
+      /* Ignore the tail '/' */
+
+      newname = memrchr(newrelpath, '/', newname - newrelpath);
+    }
+
   if (newname == NULL)
     {
       /* No subdirectories... use the root directory */
@@ -2510,6 +2576,13 @@ static int tmpfs_rename(FAR struct inode *mountpt,
   /* Get the old file name from the relative path */
 
   oldname = strrchr(oldrelpath, '/');
+  if (oldname && oldname[1] == '\0')
+    {
+      /* Ignore the tail '/' */
+
+      oldname = memrchr(oldrelpath, '/', oldname - oldrelpath);
+    }
+
   if (oldname != NULL)
     {
       /* Skip over the file '/' character */