RT-Thread / RT-Thread/rt-thread
[Bug] sys_dup2在启用RT_USING_DFS_V2时会导致dfs_file_set_fpos报错
オープン
まだ誰も着手していません。
component: dfsv2
- 主要言語
- C
- スター
- 12.2k
- フォーク
- 5.4k
- 平均マージ
- 4日 12時間
- マージ済み PR(30日)
- 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 にコメントします — 二人が同じ作業をするのを防げます。
- リポジトリをフォークし、ブランチを切って変更します。
- 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