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/04 21:51:25 UTC
[incubator-nuttx] 02/03: fs/tmpfs: Remove the temporary strdup in
all place
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 6a09ed09f1d5fd8dcc28c08b9109883d6b2149e7
Author: Xiang Xiao <xi...@xiaomi.com>
AuthorDate: Fri Jun 25 00:21:08 2021 +0800
fs/tmpfs: Remove the temporary strdup in all place
Signed-off-by: Xiang Xiao <xi...@xiaomi.com>
Change-Id: I224cc9d4ec5fd08937f9f2ddfff022866090be29
---
fs/tmpfs/fs_tmpfs.c | 170 +++++++++++++++++++---------------------------------
1 file changed, 63 insertions(+), 107 deletions(-)
diff --git a/fs/tmpfs/fs_tmpfs.c b/fs/tmpfs/fs_tmpfs.c
index a360c6e..a60d70c 100644
--- a/fs/tmpfs/fs_tmpfs.c
+++ b/fs/tmpfs/fs_tmpfs.c
@@ -83,7 +83,7 @@ static int tmpfs_realloc_file(FAR struct tmpfs_file_s *tfo,
static void tmpfs_release_lockedobject(FAR struct tmpfs_object_s *to);
static void tmpfs_release_lockedfile(FAR struct tmpfs_file_s *tfo);
static int tmpfs_find_dirent(FAR struct tmpfs_directory_s *tdo,
- FAR const char *name);
+ FAR const char *name, size_t len);
static int tmpfs_remove_dirent(FAR struct tmpfs_directory_s *tdo,
FAR const char *name);
static int tmpfs_add_dirent(FAR struct tmpfs_directory_s *tdo,
@@ -95,14 +95,15 @@ static FAR struct tmpfs_directory_s *tmpfs_alloc_directory(void);
static int tmpfs_create_directory(FAR struct tmpfs_s *fs,
FAR const char *relpath, FAR struct tmpfs_directory_s **tdo);
static int tmpfs_find_object(FAR struct tmpfs_s *fs,
- FAR const char *relpath, FAR struct tmpfs_object_s **object,
+ FAR const char *relpath, size_t len,
+ FAR struct tmpfs_object_s **object,
FAR struct tmpfs_directory_s **parent);
static int tmpfs_find_file(FAR struct tmpfs_s *fs,
FAR const char *relpath,
FAR struct tmpfs_file_s **tfo,
FAR struct tmpfs_directory_s **parent);
static int tmpfs_find_directory(FAR struct tmpfs_s *fs,
- FAR const char *relpath,
+ FAR const char *relpath, size_t len,
FAR struct tmpfs_directory_s **tdo,
FAR struct tmpfs_directory_s **parent);
static int tmpfs_statfs_callout(FAR struct tmpfs_directory_s *tdo,
@@ -450,7 +451,7 @@ static void tmpfs_release_lockedfile(FAR struct tmpfs_file_s *tfo)
****************************************************************************/
static int tmpfs_find_dirent(FAR struct tmpfs_directory_s *tdo,
- FAR const char *name)
+ FAR const char *name, size_t len)
{
int i;
@@ -458,7 +459,8 @@ static int tmpfs_find_dirent(FAR struct tmpfs_directory_s *tdo,
for (i = 0;
i < tdo->tdo_nentries &&
- strcmp(tdo->tdo_entry[i].tde_name, name) != 0;
+ (strncmp(tdo->tdo_entry[i].tde_name, name, len) != 0 ||
+ tdo->tdo_entry[i].tde_name[len] != 0);
i++);
/* Return what we found, if anything */
@@ -478,7 +480,7 @@ static int tmpfs_remove_dirent(FAR struct tmpfs_directory_s *tdo,
/* Search the list of directory entries for a match */
- index = tmpfs_find_dirent(tdo, name);
+ index = tmpfs_find_dirent(tdo, name, strlen(name));
if (index < 0)
{
return index;
@@ -594,28 +596,19 @@ static int tmpfs_create_file(FAR struct tmpfs_s *fs,
{
FAR struct tmpfs_directory_s *parent;
FAR struct tmpfs_file_s *newtfo;
- FAR char *copy;
- FAR char *name;
+ FAR const char *name;
int ret;
- /* Duplicate the path variable so that we can modify it */
-
- copy = strdup(relpath);
- if (copy == NULL)
- {
- return -ENOMEM;
- }
-
/* Separate the path into the file name and the path to the parent
* directory.
*/
- name = strrchr(copy, '/');
+ name = strrchr(relpath, '/');
if (name == NULL)
{
/* No subdirectories... use the root directory */
- name = copy;
+ name = relpath;
parent = (FAR struct tmpfs_directory_s *)fs->tfs_root.tde_object;
/* Lock the root directory to emulate the behavior of
@@ -625,7 +618,6 @@ static int tmpfs_create_file(FAR struct tmpfs_s *fs,
ret = tmpfs_lock_directory(parent);
if (ret < 0)
{
- kmm_free(copy);
return ret;
}
@@ -633,25 +625,25 @@ static int tmpfs_create_file(FAR struct tmpfs_s *fs,
}
else
{
- /* Terminate the parent directory path */
-
- *name++ = '\0';
-
/* Locate the parent directory that should contain this name.
* On success, tmpfs_find_directory() will lock the parent
* directory and increment the reference count.
*/
- ret = tmpfs_find_directory(fs, copy, &parent, NULL);
+ ret = tmpfs_find_directory(fs, relpath, name - relpath, &parent, NULL);
if (ret < 0)
{
- goto errout_with_copy;
+ return ret;
}
+
+ /* Skip the '/' path separator */
+
+ name++;
}
/* Verify that no object of this name already exists in the directory */
- ret = tmpfs_find_dirent(parent, name);
+ ret = tmpfs_find_dirent(parent, name, strlen(name));
if (ret != -ENOENT)
{
/* Something with this name already exists in the directory.
@@ -690,9 +682,8 @@ static int tmpfs_create_file(FAR struct tmpfs_s *fs,
parent->tdo_refs--;
tmpfs_unlock_directory(parent);
- /* Free the copy of the relpath and return success */
+ /* Return success */
- kmm_free(copy);
*tfo = newtfo;
return OK;
@@ -705,9 +696,6 @@ errout_with_file:
errout_with_parent:
parent->tdo_refs--;
tmpfs_unlock_directory(parent);
-
-errout_with_copy:
- kmm_free(copy);
return ret;
}
@@ -752,34 +740,24 @@ static int tmpfs_create_directory(FAR struct tmpfs_s *fs,
{
FAR struct tmpfs_directory_s *parent;
FAR struct tmpfs_directory_s *newtdo;
- FAR char *copy;
- FAR char *name;
+ FAR const char *name;
int ret;
- /* Duplicate the path variable so that we can modify it */
-
- copy = strdup(relpath);
- if (copy == NULL)
- {
- return -ENOMEM;
- }
-
/* Separate the path into the file name and the path to the parent
* directory.
*/
- name = strrchr(copy, '/');
+ name = strrchr(relpath, '/');
if (name == NULL)
{
/* No subdirectories... use the root directory */
- name = copy;
+ name = relpath;
parent = (FAR struct tmpfs_directory_s *)fs->tfs_root.tde_object;
ret = tmpfs_lock_directory(parent);
if (ret < 0)
{
- kmm_free(copy);
return ret;
}
@@ -787,25 +765,25 @@ static int tmpfs_create_directory(FAR struct tmpfs_s *fs,
}
else
{
- /* Terminate the parent directory path */
-
- *name++ = '\0';
-
/* Locate the parent directory that should contain this name.
* On success, tmpfs_find_directory() will lockthe parent
* directory and increment the reference count.
*/
- ret = tmpfs_find_directory(fs, copy, &parent, NULL);
+ ret = tmpfs_find_directory(fs, relpath, name - relpath, &parent, NULL);
if (ret < 0)
{
- goto errout_with_copy;
+ return ret;
}
+
+ /* Skip the '/' path separator */
+
+ name++;
}
/* Verify that no object of this name already exists in the directory */
- ret = tmpfs_find_dirent(parent, name);
+ ret = tmpfs_find_dirent(parent, name, strlen(name));
if (ret != -ENOENT)
{
/* Something with this name already exists in the directory.
@@ -845,7 +823,6 @@ static int tmpfs_create_directory(FAR struct tmpfs_s *fs,
parent->tdo_refs--;
tmpfs_unlock_directory(parent);
- kmm_free(copy);
/* Return the (unlocked, unreferenced) directory object to the caller */
@@ -865,9 +842,6 @@ errout_with_directory:
errout_with_parent:
parent->tdo_refs--;
tmpfs_unlock_directory(parent);
-
-errout_with_copy:
- kmm_free(copy);
return ret;
}
@@ -876,43 +850,40 @@ errout_with_copy:
****************************************************************************/
static int tmpfs_find_object(FAR struct tmpfs_s *fs,
- FAR const char *relpath,
+ FAR const char *relpath, size_t len,
FAR struct tmpfs_object_s **object,
FAR struct tmpfs_directory_s **parent)
{
FAR struct tmpfs_object_s *to = NULL;
FAR struct tmpfs_directory_s *tdo = NULL;
FAR struct tmpfs_directory_s *next_tdo;
- FAR char *segment;
- FAR char *next_segment;
- FAR char *tkptr;
- FAR char *copy;
+ FAR const char *segment;
+ FAR const char *next_segment;
int index;
int ret;
- /* Make a copy of the path (so that we can modify it via strtok) */
-
- copy = strdup(relpath);
- if (copy == NULL)
- {
- return -ENOMEM;
- }
-
/* Traverse the file system for any object with the matching name */
to = fs->tfs_root.tde_object;
next_tdo = (FAR struct tmpfs_directory_s *)fs->tfs_root.tde_object;
- for (segment = strtok_r(copy, "/", &tkptr);
- segment != NULL;
- segment = next_segment)
+ for (segment = relpath; len != 0; segment = next_segment + 1)
{
/* Get the next segment after the one we are currently working on.
* This will be NULL is we are working on the final segment of the
* relpath.
*/
- next_segment = strtok_r(NULL, "/", &tkptr);
+ next_segment = memchr(segment, '/', len);
+ if (next_segment)
+ {
+ len -= next_segment + 1 - segment;
+ }
+ else
+ {
+ next_segment = segment + len;
+ len = 0;
+ }
/* Search the next directory. */
@@ -922,12 +893,11 @@ static int tmpfs_find_object(FAR struct tmpfs_s *fs,
* directory.
*/
- index = tmpfs_find_dirent(tdo, segment);
+ index = tmpfs_find_dirent(tdo, segment, next_segment - segment);
if (index < 0)
{
/* No object with this name exists in the directory. */
- kmm_free(copy);
return index;
}
@@ -939,7 +909,7 @@ static int tmpfs_find_object(FAR struct tmpfs_s *fs,
{
/* No. Was this the final segment in the path? */
- if (next_segment == NULL)
+ if (len == 0)
{
/* Then we can break out of the loop now */
@@ -951,7 +921,6 @@ static int tmpfs_find_object(FAR struct tmpfs_s *fs,
* segments do no correspond to directories.
*/
- kmm_free(copy);
return -ENOTDIR;
}
@@ -968,10 +937,6 @@ static int tmpfs_find_object(FAR struct tmpfs_s *fs,
* Increment the reference count on the located object.
*/
- /* Free the dup'ed string */
-
- kmm_free(copy);
-
/* Return what we found */
if (parent)
@@ -1034,7 +999,7 @@ static int tmpfs_find_file(FAR struct tmpfs_s *fs,
* reference count on both.
*/
- ret = tmpfs_find_object(fs, relpath, &to, parent);
+ ret = tmpfs_find_object(fs, relpath, strlen(relpath), &to, parent);
if (ret >= 0)
{
/* We found it... but is it a regular file? */
@@ -1069,7 +1034,7 @@ static int tmpfs_find_file(FAR struct tmpfs_s *fs,
****************************************************************************/
static int tmpfs_find_directory(FAR struct tmpfs_s *fs,
- FAR const char *relpath,
+ FAR const char *relpath, size_t len,
FAR struct tmpfs_directory_s **tdo,
FAR struct tmpfs_directory_s **parent)
{
@@ -1078,7 +1043,7 @@ static int tmpfs_find_directory(FAR struct tmpfs_s *fs,
/* Find the object at this path */
- ret = tmpfs_find_object(fs, relpath, &to, parent);
+ ret = tmpfs_find_object(fs, relpath, len, &to, parent);
if (ret >= 0)
{
/* We found it... but is it a regular file? */
@@ -1907,7 +1872,7 @@ static int tmpfs_opendir(FAR struct inode *mountpt, FAR const char *relpath,
* lock on the returned directory.
*/
- ret = tmpfs_find_directory(fs, relpath, &tdo, NULL);
+ ret = tmpfs_find_directory(fs, relpath, strlen(relpath), &tdo, NULL);
if (ret >= 0)
{
dir->u.tmpfs.tf_tdo = tdo;
@@ -2377,7 +2342,7 @@ static int tmpfs_rmdir(FAR struct inode *mountpt, FAR const char *relpath)
* on each.
*/
- ret = tmpfs_find_directory(fs, relpath, &tdo, &parent);
+ ret = tmpfs_find_directory(fs, relpath, strlen(relpath), &tdo, &parent);
if (ret < 0)
{
goto errout_with_lock;
@@ -2458,8 +2423,7 @@ static int tmpfs_rename(FAR struct inode *mountpt,
FAR struct tmpfs_object_s *to;
FAR struct tmpfs_s *fs;
FAR const char *oldname;
- FAR char *newname;
- FAR char *copy;
+ FAR const char *newname;
int ret;
finfo("mountpt: %p oldrelpath: %s newrelpath: %s\n",
@@ -2471,20 +2435,11 @@ static int tmpfs_rename(FAR struct inode *mountpt,
fs = mountpt->i_private;
DEBUGASSERT(fs != NULL && fs->tfs_root.tde_object != NULL);
- /* Duplicate the newpath variable so that we can modify it */
-
- copy = strdup(newrelpath);
- if (copy == NULL)
- {
- return -ENOMEM;
- }
-
/* Get exclusive access to the file system */
ret = tmpfs_lock(fs);
if (ret < 0)
{
- kmm_free(copy);
return ret;
}
@@ -2492,12 +2447,12 @@ static int tmpfs_rename(FAR struct inode *mountpt,
* parent directory.
*/
- newname = strrchr(copy, '/');
+ newname = strrchr(newrelpath, '/');
if (newname == NULL)
{
/* No subdirectories... use the root directory */
- newname = copy;
+ newname = newrelpath;
newparent = (FAR struct tmpfs_directory_s *)fs->tfs_root.tde_object;
tmpfs_lock_directory(newparent);
@@ -2505,27 +2460,28 @@ static int tmpfs_rename(FAR struct inode *mountpt,
}
else
{
- /* Terminate the parent directory path */
-
- *newname++ = '\0';
-
/* Locate the parent directory that should contain this name.
* On success, tmpfs_find_directory() will lockthe parent
* directory and increment the reference count.
*/
- ret = tmpfs_find_directory(fs, copy, &newparent, NULL);
+ ret = tmpfs_find_directory(fs, newrelpath, newname - newrelpath,
+ &newparent, NULL);
if (ret < 0)
{
goto errout_with_lock;
}
+
+ /* Skip the '/' path separator */
+
+ newname++;
}
/* Verify that no object of this name already exists in the destination
* directory.
*/
- ret = tmpfs_find_dirent(newparent, newname);
+ ret = tmpfs_find_dirent(newparent, newname, strlen(newname));
if (ret != -ENOENT)
{
/* Something with this name already exists in the directory.
@@ -2545,7 +2501,8 @@ static int tmpfs_rename(FAR struct inode *mountpt,
* the reference count on both.
*/
- ret = tmpfs_find_object(fs, oldrelpath, &to, &oldparent);
+ ret = tmpfs_find_object(fs, oldrelpath, strlen(oldrelpath),
+ &to, &oldparent);
if (ret < 0)
{
goto errout_with_newparent;
@@ -2591,7 +2548,6 @@ errout_with_newparent:
errout_with_lock:
tmpfs_unlock(fs);
- kmm_free(copy);
return ret;
}
@@ -2675,7 +2631,7 @@ static int tmpfs_stat(FAR struct inode *mountpt, FAR const char *relpath,
* reference count on the object.
*/
- ret = tmpfs_find_object(fs, relpath, &to, NULL);
+ ret = tmpfs_find_object(fs, relpath, strlen(relpath), &to, NULL);
if (ret < 0)
{
goto errout_with_fslock;