[BUG] fs/vfs: missing POSIX iovcnt bounds and iov_len overflow validation in readv/writev
メンテナーはふだん 1 日以内に返信
評価
- 難易度
- 3/5
- 見積もり時間
- 1〜2日
- 初心者へのやさしさ
- 25/100
- issue の種類
- バグ
- 明瞭さ
- 明確に書かれている
- 活発さ
- 停滞
- 技術スタック
- c
調査の方向性
Read fs/vfs/fs_read.c and fs/vfs/fs_write.c, especially file_readv_compat() and file_writev_compat(), then check the existing declarations and TODOs in include/sys/uio.h. The issue describes the invalid iovcnt and iov_len cases to review; done means both calls reject invalid requests upfront without transferring data and the header notes reflect the completed validation.
索引モデルが issue の本文から書いたものです。
説明
Description
POSIX.1-2017 (IEEE Std 1003.1-2017) and POSIX.1-2024 explicitly mandate for both readv() and writev():
"The
readv()/writev()function shall fail if:
[EINVAL]The sum of theiov_lenvalues in theiovarray overflowed anssize_t.
or
[EINVAL]Theiovcntargument was less than or equal to 0, or greater than{IOV_MAX}."
Currently, NuttX's VFS layer (fs/vfs/fs_read.c and fs/vfs/fs_write.c) does not enforce these boundaries, leading to non-compliant return values and partial I/O on overflow.
In fact, this omission is already noted in include/sys/uio.h (lines 107-108, 132-133, 149-150):
/* In include/sys/uio.h: */
* EINVAL.
* The sum of the iov_len values in the iov array overflowed an ssize_t
* or The 'iovcnt' argument was less than or equal to 0, or greater than
* IOV_MAX (Not implemented).
*
* TODO: If the sum of the iov_len values is greater than SSIZE_MAX, the
* operation will fail and no data will be transferred.
Steps to Reproduce
-
Call
readv(fd, iov, 0)orwritev(fd, iov, 0):- Expected (POSIX): Returns
-1,errno = EINVAL. - Actual (NuttX): Returns
0(indicates zero-byte success / EOF).
- Expected (POSIX): Returns
-
Call
readv(fd, iov, -1)orwritev(fd, iov, -1):- Expected (POSIX): Returns
-1,errno = EINVAL. - Actual (NuttX): Bypasses validation and returns
0.
- Expected (POSIX): Returns
-
Call
readv()orwritev()withiovcnt > IOV_MAX:- Expected (POSIX): Returns
-1,errno = EINVAL. - Actual (NuttX): Allowed and processed unchecked.
- Expected (POSIX): Returns
-
Call
readv()orwritev()whereiov[0].iov_len = 10andiov[1].iov_len = SSIZE_MAX:- Expected (POSIX): Returns
-1,errno = EINVALupfront, with no data read or written. - Actual (NuttX): In
file_readv_compat()andfile_writev_compat(), transfers 10 bytes oniov[0], detects overflow oniov[1], executesbreak, and returns10(partial transfer) rather than rejecting the invalid request upfront.
- Expected (POSIX): Returns
Behavior Comparison
| Scenario / Parameter | POSIX IEEE Std 1003.1 | Current NuttX VFS | Proposed Fix |
|---|---|---|---|
iovcnt == 0 |
Fail with [EINVAL] |
Returns 0 (Success) |
Fail with -EINVAL |
iovcnt < 0 |
Fail with [EINVAL] |
Returns 0 (Success) |
Fail with -EINVAL |
iovcnt > IOV_MAX |
Fail with [EINVAL] |
Unchecked / Allowed | Fail with -EINVAL |
Sum of iov_len > SSIZE_MAX (i == 0) |
Fail with [EINVAL] |
Fails with -EINVAL |
Fail upfront with -EINVAL |
Sum of iov_len > SSIZE_MAX (i > 0) |
Fail with [EINVAL], no data transferred |
Returns partial bytes (ntotal) |
Fail upfront with -EINVAL, no data transferred |
Proposed Solution
- In
file_readv()andfile_writev(), validateiovcntupfront:if (iovcnt <= 0 || iovcnt > IOV_MAX) { return -EINVAL; } - Validate in an upfront pass that the accumulated sum of
iov_lendoes not exceedSSIZE_MAXbefore initiating any file operations or acquiring locks, returning-EINVALon overflow. - Update the comments and
TODOitems ininclude/sys/uio.hto reflect the completed POSIX conformance.
I have a patch ready with 100% nxstyle and checkpatch compliance and would be glad to submit a PR if this is the desired approach.
On which OS does this issue occur?
[OS: Linux]
What is the version of your OS?
Ubuntu 22.04 LTS (all)
NuttX Version
master
Issue Architecture
[Arch: all]
Issue Area
[Area: Posix]
Host information
Host: Linux x86_64 / Ubuntu 22.04 (Architecture-independent VFS logic bug)
Target: All architectures (sim:nsh, arm, etc.)
Verification
- I have verified before submitting the report.
- 主要言語
- C
- スター
- 4.1k
- フォーク
- 1.8k
- 平均マージ
- 1日 4時間
- マージ済み PR(30日)
- 843
環境構築
- Dockerfile・Docker Compose ファイルなし
- プルリクエストのテンプレートあり
- コントリビューションガイドを読む
はじめの一歩
- issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
- 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
- リポジトリをフォークし、ブランチを切って変更します。
- issue 番号を参照したプルリクエストを送ります。
apache/nuttx のほかの issue
-
Arch: all Arch: arm Area: Build system OS: Linux Type: Bug
難易度 2/5 1〜3時間 初心者へのやさしさ 65/100
メンテナーはふだん 1 日以内に返信
-
難易度 2/5 1〜3時間 初心者へのやさしさ 72/100
apache/nuttx#19435 · コメント 8 件 ·
メンテナーはふだん 1 日以内に返信
-
Type: Bug
難易度 2/5 1〜3時間 初心者へのやさしさ 65/100
apache/nuttx#17343 · コメント 4 件 ·
メンテナーはふだん 1 日以内に返信
-
Arch: all OS: Linux Type: Bug
難易度 2/5 1〜3時間 初心者へのやさしさ 68/100
apache/nuttx#16249 · コメント 7 件 ·
メンテナーはふだん 1 日以内に返信
-
Arch: simulator Arch: xtensa Area: Kernel OS: Mac Type: Bug
難易度 4/5 3〜5日 初心者へのやさしさ 48/100
apache/nuttx#21499 · コメント 1 件 ·
メンテナーはふだん 1 日以内に返信
似ている issue
-
bug
難易度 2/5 1〜3時間 初心者へのやさしさ 68/100
msys2/MINGW-packages#33356 · コメント 1 件 ·
メンテナーはふだん 1 日以内に返信
-
難易度 2/5 1〜3時間 初心者へのやさしさ 70/100
kmod-project/kmod#492 ·
メンテナーはふだん 4 日以内に返信
-
難易度 2/5 1〜3時間 初心者へのやさしさ 68/100
PecanProject/sipnet#435 · コメント 1 件 ·
メンテナーはふだん 2 日以内に返信
-
SDL_GPU Vulkan: wrong screen orientation on OpenHarmony (preTransform set without pre-rotation)オープン
難易度 2/5 1〜3時間 初心者へのやさしさ 82/100
libsdl-org/SDL#16670 ·
メンテナーはふだん 1 日以内に返信
-
難易度 2/5 1〜3時間 初心者へのやさしさ 68/100