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:
yukangzhi
2026-08-28 23:07:24 +08:00
committed by Xiang Xiao
parent 67cd42677b
commit 1312bc84a2
4 changed files with 239 additions and 397 deletions
+6 -46
View File
@@ -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);
}
/****************************************************************************
+5 -47
View File
@@ -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
View File
@@ -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
View File
File diff suppressed because it is too large Load Diff