RT-Thread / RT-Thread/rt-thread

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

Offen
#9,155 1 Kommentar 1 Reaktion 0 zugewiesene Personen Auf GitHub ansehen

Dieses Issue hat noch niemand übernommen.

component: dfsv2
Vorherrschende Sprache
C
Sterne
12.2k
Forks
5.4k
Ø Merge
4 T. 12 Std.
Gemergte PRs (30 T.)
40

Beschreibung

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

Beitragsleitfaden

Beitragsleitfaden öffnen

Erste Schritte

  1. Lies das ganze Issue und danach den Beitragsleitfaden des Projekts.
  2. Schreib ins Issue, dass du es übernimmst — das erspart doppelte Arbeit.
  3. Forke das Repository und arbeite in einem Branch.
  4. Öffne einen Pull Request, der die Issue-Nummer nennt.

Rechercherichtung

Beginne damit, sys_dup2 und dfs_file_read in components/dfs/dfs_v2/src/dfs_file.c nachzuverfolgen, und untersuche anschließend serial_fops_read und dfs_file_set_fpos. Reproduziere den Fall RT_USING_DFS_V2, während uart0 bei einem Lesevorgang blockiert ist, und überprüfe, dass die gleichzeitige Duplizierung von Deskriptoren nicht mehr dazu führt, dass dfs_file_set_fpos abstürzt oder einen ungültigen Dateistatus verwendet.

Vom Indexierungsmodell aus dem Issue-Text verfasst.

Bewertung

Tech-Stack
c
Bereich
operating-systems
Issue-Typ
Bug
Schwierigkeit
4/5
Geschätzter Aufwand
3-5 Tage
Aktivitätsstatus
Veraltet
Klarheit
Größtenteils klar
Anfängerfreundlichkeit
38/100

Neue Issues direkt in Ihr Postfach

Eine kurze Übersicht über anfängerfreundliche GitHub-Issues.