RT-Thread / RT-Thread/rt-thread

[Bug] sys_dup2在启用RT_USING_DFS_V2时会导致dfs_file_set_fpos报错

Đang mở
#9,155 1 bình luận 1 reaction 0 người được giao Xem trên GitHub

Chưa có ai nhận issue này.

component: dfsv2
Ngôn ngữ chính
C
Star
12.2k
Fork
5.4k
Merge trung bình
4 ngày 12 giờ
Pull request đã merge (30 ngày)
40

Mô tả

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

Hướng dẫn đóng góp

Mở hướng dẫn đóng góp

Bắt đầu từ đâu

  1. Đọc hết issue, rồi đọc hướng dẫn đóng góp của dự án.
  2. Bình luận trên issue rằng bạn sẽ nhận — tránh hai người làm cùng một việc.
  3. Fork repository và làm thay đổi trên một nhánh.
  4. Mở pull request có tham chiếu số hiệu của issue.

Hướng nghiên cứu

Bắt đầu bằng cách theo dõi sys_dup2 và dfs_file_read trong components/dfs/dfs_v2/src/dfs_file.c, sau đó kiểm tra serial_fops_read và dfs_file_set_fpos. Tái hiện trường hợp RT_USING_DFS_V2 trong khi uart0 bị chặn ở thao tác đọc, và xác minh rằng việc nhân bản descriptor đồng thời không còn khiến dfs_file_set_fpos bị crash hoặc sử dụng trạng thái tệp không hợp lệ.

Do mô hình lập chỉ mục viết ra từ nội dung của issue.

Đánh giá

Công nghệ
c
Lĩnh vực
operating-systems
Loại issue
Lỗi
Độ khó
4/5
Thời gian dự kiến
3-5 ngày
Mức độ hoạt động
Đình trệ
Độ rõ ràng
Khá rõ ràng
Mức phù hợp với người mới
38/100

Nhận issue mới trong hộp thư của bạn

Bản tóm tắt ngắn những issue GitHub phù hợp với người mới.