Nonsense UNKNOWN error when writing large buffers with fs.writev
まだ誰も着手していません。
- 主要言語
- JavaScript
- スター
- 122k
- フォーク
- 37.3k
- 平均マージ
- 4日 2時間
- マージ済み PR(30日)
- 283
説明
Version
14.18.1
Platform
Linux ops 5.11.0-1021-gcp #23~20.04.1-Ubuntu SMP Fri Oct 1 19:04:32 UTC 2021 x86_64 x86_64 x86_64 GNU/Linu
Subsystem
fs
What steps will reproduce the bug?
const fs = require("fs");
const fd = fs.openSync("./test.dat", fs.constants.O_WRONLY | fs.constants.O_CREAT, 0o666);
const bufs = [Buffer.alloc(0x7FFFFFFF + 1)];
fs.writevSync(fd, bufs, 0);
This throws
Uncaught Error: UNKNOWN: unknown error, write
at Object.writevSync (fs.js:749:3) {
errno: -2147483648,
syscall: 'write',
code: 'UNKNOWN'
}
That errno is 0x7fffffff + 1 wrapped around.
How often does it reproduce? Is there a required condition?
Always.
What is the expected behavior?
Should either work, since pwritev(2) works (I don't know if it has a limit less than SSIZE_MAX), or report a proper error before making the syscall. I did the latter recently for fs.write in c4e7dca8f30ff89b42e96fb8819558ed518a72dd. It would be nice if large files actually worked, but the best fix for that would require a new libuv function.
What do you see instead?
No response
Additional information
No response
コントリビューションガイド
はじめの一歩
- issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
- 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
- リポジトリをフォークし、ブランチを切って変更します。
- issue 番号を参照したプルリクエストを送ります。
調査の方向性
fs.js の fs.writevSync から始め、引数の処理を、コミット c4e7dca8f30ff89b42e96fb8819558ed518a72dd で参照されている fs.write の検証と比較します。Linux で大きなバッファーのケースを再現し、その後、完成した動作では syscall の前に適切なエラーでリクエストを拒否すべきか、それとも libuv を通じてより大きなバッファーをサポートすべきかを判断します。
索引モデルが issue の本文から書いたものです。
評価
- 技術スタック
- javascript, node.js
- 領域
- backend, operating-systems
- issue の種類
- バグ
- 難易度
- 4/5
- 見積もり時間
- 3〜5日
- 活発さ
- 静か
- 明瞭さ
- おおむね明確
- 初心者へのやさしさ
- 45/100