mirror of
https://github.com/apache/nuttx.git
synced 2026-10-06 11:03:16 +08:00
fs: remove redundant ".." handling after VFS canonicalization
Since _inode_canonicalize() now resolves all "." and ".." segments in the common VFS layer before inode search, the relpath passed to each filesystem will never contain ".." segments. Remove the now-dead ".." handling code from individual filesystem layers and the inode search internals. Files modified (redundant ".." path resolution removed): - fs/hostfs/hostfs.c: remove depth-tracking escape check in hostfs_mkpath(), simplify to direct path concatenation. - fs/rpmsgfs/rpmsgfs.c: same as hostfs, remove depth-tracking in rpmsgfs_mkpath(). - fs/smartfs/smartfs_utils.c: remove "." and ".." segment checks in smartfs_finddirentry(), de-indent the remaining search logic. - fs/inode/fs_inodesearch.c: remove _inode_isdotdot() function, simplify _compute_path_depth() to only count forward segments, remove dead else-if branch in _inode_search(). Files NOT modified (and why): - fs/littlefs/littlefs/lfs.c: third-party upstream library (git submodule), must not be modified locally. - fs/fatfs/fatfs/source/ff.c: third-party upstream library. - fs/lwext4/lwext4/src/ext4*.c: third-party upstream library. - fs/cromfs/fs_cromfs.c: handles "." and ".." as directory entries (structural, not path resolution), so its code stays. - fs/vfs/fs_symlink.c: constructs relative paths containing ".." (writes, not parses relpath). Signed-off-by: yukangzhi <yukangzhi@xiaomi.com>
This commit is contained in:
+6
-46
@@ -201,54 +201,14 @@ static void hostfs_mkpath(FAR struct hostfs_mountpt_s *fs,
|
||||
FAR const char *relpath,
|
||||
FAR char *path, int pathlen)
|
||||
{
|
||||
int depth = 0;
|
||||
int first;
|
||||
int x;
|
||||
|
||||
/* Copy base host path to output */
|
||||
|
||||
strlcpy(path, fs->fs_root, pathlen);
|
||||
|
||||
/* Be sure we aren't trying to use ".." to display outside of our
|
||||
* mounted path.
|
||||
/* Copy base host path to output and append relative path directly.
|
||||
* Note: Both ".." segments and leading slashes are already resolved
|
||||
* by the VFS layer (_inode_canonicalize + inode_nextname) before
|
||||
* relpath reaches here.
|
||||
*/
|
||||
|
||||
x = 0;
|
||||
while (relpath[x] == '/')
|
||||
{
|
||||
x++;
|
||||
}
|
||||
|
||||
first = x;
|
||||
|
||||
while (relpath[x] != '\0')
|
||||
{
|
||||
/* Test for ".." occurrence */
|
||||
|
||||
if (strncmp(&relpath[x], "..", 2) == 0)
|
||||
{
|
||||
/* Reduce depth by 1 */
|
||||
|
||||
depth--;
|
||||
x += 2;
|
||||
}
|
||||
|
||||
else if (relpath[x] == '/' && relpath[x + 1] != '/' &&
|
||||
relpath[x + 1] != '\0')
|
||||
{
|
||||
depth++;
|
||||
x++;
|
||||
}
|
||||
else
|
||||
{
|
||||
x++;
|
||||
}
|
||||
}
|
||||
|
||||
if (depth >= 0)
|
||||
{
|
||||
strlcat(path, &relpath[first], pathlen);
|
||||
}
|
||||
strlcpy(path, fs->fs_root, pathlen);
|
||||
strlcat(path, relpath, pathlen);
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
|
||||
@@ -60,16 +60,6 @@ FAR struct inode *g_root_inode = NULL;
|
||||
* Private Functions
|
||||
****************************************************************************/
|
||||
|
||||
/****************************************************************************
|
||||
* Name: _inode_isdotdot
|
||||
****************************************************************************/
|
||||
|
||||
static inline bool _inode_isdotdot(FAR const char *name)
|
||||
{
|
||||
return name[0] == '.' && name[1] == '.' &&
|
||||
(name[2] == '\0' || name[2] == '/');
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
* Name: _inode_isdot
|
||||
****************************************************************************/
|
||||
@@ -221,20 +211,13 @@ static int _compute_path_depth(FAR const char *path)
|
||||
FAR const char *name = path;
|
||||
int depth = 0;
|
||||
|
||||
/* After _inode_canonicalize(), path never contains ".." segments,
|
||||
* so we only need to count path components.
|
||||
*/
|
||||
|
||||
while (*name != '\0')
|
||||
{
|
||||
if (_inode_isdotdot(name))
|
||||
{
|
||||
if (--depth < 0)
|
||||
{
|
||||
break;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
depth++;
|
||||
}
|
||||
|
||||
depth++;
|
||||
name = inode_nextname(name);
|
||||
}
|
||||
|
||||
@@ -512,31 +495,6 @@ static int _inode_search(FAR struct inode_search_s *desc)
|
||||
ret = OK;
|
||||
break;
|
||||
}
|
||||
else if (_inode_isdotdot(name))
|
||||
{
|
||||
do
|
||||
{
|
||||
if (above != NULL)
|
||||
{
|
||||
inode = above;
|
||||
above = above->i_parent;
|
||||
}
|
||||
|
||||
name = inode_nextname(name);
|
||||
}
|
||||
while (_inode_isdotdot(name));
|
||||
|
||||
if (*name == '\0')
|
||||
{
|
||||
relpath = name;
|
||||
ret = OK;
|
||||
break;
|
||||
}
|
||||
|
||||
above = inode;
|
||||
left = NULL;
|
||||
inode = inode->i_child;
|
||||
}
|
||||
else
|
||||
{
|
||||
/* More nodes to be examined in the path "below" this one. */
|
||||
|
||||
+6
-46
@@ -232,54 +232,14 @@ static void rpmsgfs_mkpath(FAR struct rpmsgfs_mountpt_s *fs,
|
||||
FAR const char *relpath,
|
||||
FAR char *path, int pathlen)
|
||||
{
|
||||
int depth = 0;
|
||||
int first;
|
||||
int x;
|
||||
|
||||
/* Copy base host path to output */
|
||||
|
||||
strlcpy(path, fs->fs_root, pathlen);
|
||||
|
||||
/* Be sure we aren't trying to use ".." to display outside of our
|
||||
* mounted path.
|
||||
/* Copy base host path to output and append relative path directly.
|
||||
* Note: Both ".." segments and leading slashes are already resolved
|
||||
* by the VFS layer (_inode_canonicalize + inode_nextname) before
|
||||
* relpath reaches here.
|
||||
*/
|
||||
|
||||
x = 0;
|
||||
while (relpath[x] == '/')
|
||||
{
|
||||
x++;
|
||||
}
|
||||
|
||||
first = x;
|
||||
|
||||
while (relpath[x] != '\0')
|
||||
{
|
||||
/* Test for ".." occurrence */
|
||||
|
||||
if (strncmp(&relpath[x], "..", 2) == 0)
|
||||
{
|
||||
/* Reduce depth by 1 */
|
||||
|
||||
depth--;
|
||||
x += 2;
|
||||
}
|
||||
|
||||
else if (relpath[x] == '/' && relpath[x + 1] != '/' &&
|
||||
relpath[x + 1] != '\0')
|
||||
{
|
||||
depth++;
|
||||
x++;
|
||||
}
|
||||
else
|
||||
{
|
||||
x++;
|
||||
}
|
||||
}
|
||||
|
||||
if (depth >= 0)
|
||||
{
|
||||
strlcat(path, &relpath[first], pathlen - strlen(path));
|
||||
}
|
||||
strlcpy(path, fs->fs_root, pathlen);
|
||||
strlcat(path, relpath, pathlen);
|
||||
|
||||
while (fs->timeout > 0)
|
||||
{
|
||||
|
||||
+222
-258
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user