Skip to content

Commit beab78f

Browse files
wdfk-progRbb666
authored andcommitted
fix[DFS][littlefs]: validate directory seek and cross-mount rename
reject cross-mount dentry rename with -EXDEV before using the old mount context validate directory lseek offsets before converting them to littlefs directory positions return -EINVAL for negative or non-dirent-aligned directory offsets
1 parent f314ef9 commit beab78f

1 file changed

Lines changed: 18 additions & 2 deletions

File tree

dfs_lfs.c

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1134,9 +1134,19 @@ static DFS_LFS_LSK_RETURN_TYPE _dfs_lfs_lseek(DFS_LFS_LSEEK_PARAMS)
11341134
}
11351135
else if (DFS_LFS_FILE_TYPE(file) == FT_DIRECTORY)
11361136
{
1137+
lfs_off_t off;
1138+
lfs_soff_t soff;
1139+
DFS_LFS_LSK_RETURN_TYPE dirent_size;
1140+
1141+
dirent_size = (DFS_LFS_LSK_RETURN_TYPE)sizeof(struct dirent);
1142+
if ((offset < 0) || ((offset % dirent_size) != 0))
1143+
{
1144+
return -EINVAL;
1145+
}
1146+
11371147
/* skip . and .. */
1138-
lfs_off_t off = offset / sizeof(struct dirent) + 2;
1139-
lfs_soff_t soff = lfs_dir_seek(dfs_lfs_fd->lfs, &dfs_lfs_fd->u.dir, off);
1148+
off = (lfs_off_t)(offset / dirent_size) + 2;
1149+
soff = lfs_dir_seek(dfs_lfs_fd->lfs, &dfs_lfs_fd->u.dir, off);
11401150
if (soff < 0)
11411151
{
11421152
return _lfs_result_to_dfs((int)soff);
@@ -1251,6 +1261,12 @@ static int _dfs_lfs_dentry_rename(struct dfs_dentry* old_dentry, struct dfs_dent
12511261
RT_ASSERT(old_dentry != RT_NULL);
12521262
RT_ASSERT(old_dentry->mnt != RT_NULL);
12531263
RT_ASSERT(new_dentry != RT_NULL);
1264+
RT_ASSERT(new_dentry->mnt != RT_NULL);
1265+
1266+
if (old_dentry->mnt != new_dentry->mnt)
1267+
{
1268+
return -EXDEV;
1269+
}
12541270

12551271
return _dfs_lfs_rename(old_dentry->mnt, old_dentry->pathname, new_dentry->pathname);
12561272
}

0 commit comments

Comments
 (0)