RT-Thread / RT-Thread/rt-thread

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

Abierto
#9,155 1 comentario 1 reacción 0 asignados Ver en GitHub

Nadie ha tomado este issue todavía.

component: dfsv2
Lenguaje dominante
C
Estrellas
12.2k
Forks
5.4k
Merge medio
4 d 12 h
PR fusionados (30 d)
40

Descripción

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

Guía de contribución

Abrir la guía de contribución

Primeros pasos

  1. Lee el issue completo y luego la guía de contribución del proyecto.
  2. Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
  3. Haz un fork del repositorio y trabaja en una rama.
  4. Abre un pull request que haga referencia al número del issue.

Línea de trabajo

Comienza rastreando sys_dup2 y dfs_file_read en components/dfs/dfs_v2/src/dfs_file.c; después, inspecciona serial_fops_read y dfs_file_set_fpos. Reproduce el caso RT_USING_DFS_V2 mientras uart0 está bloqueado en una lectura, y verifica que la duplicación concurrente de descriptores ya no provoque que dfs_file_set_fpos se bloquee o utilice un estado de archivo no válido.

Escrito por el modelo de indexación a partir del texto del issue.

Evaluación

Stack tecnológico
c
Área
operating-systems
Tipo de issue
Error
Dificultad
4/5
Tiempo estimado
3-5 días
Estado de actividad
Estancado
Claridad
Bastante claro
Aptitud para principiantes
38/100

Recibe los nuevos issues en tu correo

Un resumen breve de issues de GitHub para principiantes.