[BUG] fs/vfs: missing POSIX iovcnt bounds and iov_len overflow validation in readv/writev
I maintainer di solito rispondono entro 1 giorno
Valutazione
- Difficoltà
- 3/5
- Tempo stimato
- 1-2 giorni
- Idoneità per principianti
- 25/100
- Tipo di issue
- Bug
- Chiarezza
- Specificata chiaramente
- Stato di attività
- Ferma
- Stack tecnologico
- c
- Ambito
- operating-systems
Direzione di ricerca
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.
Scritto dal modello di indicizzazione a partire dal testo della issue.
Descrizione
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.
- Lingua principale
- C
- Stelle
- 4.1k
- Fork
- 1.8k
- Merge medio
- 1g 4h
- PR unite (30g)
- 843
Preparare l'ambiente
- Nessun Dockerfile né file Docker Compose
- Ha un modello di pull request
- Leggi la guida per i contributori
Come iniziare
- Leggi tutta la issue e poi la guida ai contributi del progetto.
- Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
- Fai un fork del repository e lavora su un branch.
- Apri una pull request che faccia riferimento al numero della issue.
Altre issue di apache/nuttx
-
Arch: all Arch: arm Area: Build system OS: Linux Type: Bug
Difficoltà 2/5 1-3 ore Idoneità per principianti 65/100
I maintainer di solito rispondono entro 1 giorno
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 72/100
apache/nuttx#19435 · 8 commenti ·
I maintainer di solito rispondono entro 1 giorno
-
Type: Bug
Difficoltà 2/5 1-3 ore Idoneità per principianti 65/100
apache/nuttx#17343 · 4 commenti ·
I maintainer di solito rispondono entro 1 giorno
-
Arch: all OS: Linux Type: Bug
Difficoltà 2/5 1-3 ore Idoneità per principianti 68/100
apache/nuttx#16249 · 7 commenti ·
I maintainer di solito rispondono entro 1 giorno
-
Arch: simulator Arch: xtensa Area: Kernel OS: Mac Type: Bug
Difficoltà 4/5 3-5 giorni Idoneità per principianti 48/100
apache/nuttx#21499 · 1 commento ·
I maintainer di solito rispondono entro 1 giorno
Tutte le issue di apache/nuttx
Issue simili
-
bug
Difficoltà 2/5 1-3 ore Idoneità per principianti 68/100
msys2/MINGW-packages#33356 · 1 commento ·
I maintainer di solito rispondono entro 1 giorno
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 70/100
kmod-project/kmod#492 ·
I maintainer di solito rispondono entro 4 giorni
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 68/100
PecanProject/sipnet#435 · 1 commento ·
I maintainer di solito rispondono entro 2 giorni
-
SDL_GPU Vulkan: wrong screen orientation on OpenHarmony (preTransform set without pre-rotation)Aperta
Difficoltà 2/5 1-3 ore Idoneità per principianti 82/100
libsdl-org/SDL#16670 ·
I maintainer di solito rispondono entro 1 giorno
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 68/100