RT-Thread / RT-Thread/rt-thread
[Bug] sys_dup2在启用RT_USING_DFS_V2时会导致dfs_file_set_fpos报错
未关闭
还没有人认领这个 Issue。
component: dfsv2
- 主要语言
- C
- 星标
- 12.2k
- 派生
- 5.4k
- 平均合并
- 4 天 12 小时
- 30 天内合并 PR
- 40
描述
RT-Thread Version
master
Hardware Type/Architectures
all
Develop Toolchain
Other
Describe the bug
在启用RT_USING_DFS_V2情况下,假设设备uart0作为串口终端(shell console),正在调用dfs_file_read()读取数据时候,或者在serial_fops_read()函数被rt_wqueue_wait挂起的时候。
如果此时调用sys_dup2(fd, 0)函数,将会关闭uart0并更新dfs_fdtable,也就是说在dfs_file_read执行过程中file指针被修改了!!!
fdt->fds[0] = fdt->fds[fd];
具体解释见下面的dfs_file_read()函数
/* fpos lock */
off_t pos = dfs_file_get_fpos(file);
ret = rw_verify_area(file, &pos, len);
if (ret > 0)
{
len = ret;
if (dfs_is_mounted(file->vnode->mnt) == 0)
{
#ifdef RT_USING_PAGECACHE
if (file->vnode->aspace && !(file->flags & O_DIRECT))
{
ret = dfs_aspace_read(file, buf, len, &pos);
}
else
#endif
{
///////////////////////////////////////////////////////////////////////////
// 就是跑到这里的时候,sys_dup2被调用了,那么file指针对应的内容被更改了,且被关闭。
///////////////////////////////////////////////////////////////////////////
ret = file->fops->read(file, buf, len, &pos);
}
}
else
{
ret = -EINVAL;
}
}
/* fpos unlock */
///////////////////////////////////////////////////////////////////////////
// 由于file指针对应的内容被更改了,因此dfs_file_set_fpos中rt_take_sem将会奔溃
///////////////////////////////////////////////////////////////////////////
dfs_file_set_fpos(file, pos);
Other additional context
No response
贡献指南
从这里开始
- 先读完整个 Issue,再读项目的贡献指南。
- 在 Issue 下留言说明你要接手 —— 这能避免两个人做同样的事。
- Fork 仓库,在一个分支上完成修改。
- 提交 Pull Request,并在描述里引用这个 Issue 编号。
调研方向
先跟踪 components/dfs/dfs_v2/src/dfs_file.c 中的 sys_dup2 和 dfs_file_read,然后检查 serial_fops_read 和 dfs_file_set_fpos。在 uart0 阻塞于读取操作时重现 RT_USING_DFS_V2 情况,并验证并发复制描述符不再导致 dfs_file_set_fpos 崩溃或使用无效的文件状态。
由索引模型根据 Issue 内容生成。
评估
- 技术栈
- c
- 领域
- operating-systems
- Issue 类型
- 缺陷
- 难度
- 4/5
- 预计耗时
- 3-5 天
- 活跃度
- 停滞
- 描述清晰度
- 基本清楚
- 新手友好度
- 38/100