[interpreter] memory.grow on an i64 memory past 2^48 pages succeeds but allocates wrong amount (or crashes)
メンテナーはふだん 1 日以内に返信
関連するプルリクエストがすでにマージされています。
- #2290 @rossberg による — マージ済み
評価
- 難易度
- 2/5
- 見積もり時間
- 1〜3時間
- 初心者へのやさしさ
- 76/100
調査の方向性
runtime/memory.mlから始め、特に27~38行付近のvalid_sizeと58~71行付近のcreate/growを確認し、その後、参照されているWebAssemblyのメモリ制限を調べてください。インタープリターで、2^48ページおよび2^48 + 1ページの報告されたケースを再現してください。過大なi64の拡張が-1で拒否され、memory.sizeが変わらず、正確な上限のケースでクラッシュしなければ完了です。
索引モデルが issue の本文から書いたものです。
説明
(module
(memory i64 1)
(func (export "grow") (param i64) (result i64) (memory.grow (local.get 0)))
(func (export "size") (result i64) (memory.size)))
(assert_return (invoke "grow" (i64.const 0x1_0000_0000_0000)) (i64.const -1))
(assert_return (invoke "size") (i64.const 1))
Result: 1 : [i64]
Expect: -1 : [i64]
assertion failure: wrong return values
Growing to exactly 2^48 pages crashes instead:
(module
(memory i64 1)
(func (export "grow") (param i64) (result i64) (memory.grow (local.get 0))))
(invoke "grow" (i64.const 0xFFFF_FFFF_FFFF))
uncaught exception Invalid_argument("Bigarray.sub: bad sub-array")
Called from Wasm__Memory.grow in file "runtime/memory.ml", line 69
valid_size accepts every size for I64AT, so the 2^48-page bound on 64-bit memories is never checked, and create computes n * page_size in Int64, which wraps. For 2^48 + 1 pages the byte count wraps to 65536, so grow reports success with a one-page buffer; for 2^48 pages it wraps to 0 and the blit fails.
https://github.com/WebAssembly/spec/blob/340650f2f620169685814774bc5b019d05d4d3d7/interpreter/runtime/memory.ml#L27-L38
https://github.com/WebAssembly/spec/blob/340650f2f620169685814774bc5b019d05d4d3d7/interpreter/runtime/memory.ml#L58-L71
Tested at 340650f.
- 主要言語
- WebAssembly
- スター
- 3.5k
- フォーク
- 540
- 平均マージ
- 1日 6分
- マージ済み PR(30日)
- 25
環境構築
- Dockerfile・Docker Compose ファイルなし
- プルリクエストのテンプレートなし
- コントリビューションガイドを読む
はじめの一歩
- issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
- 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
- リポジトリをフォークし、ブランチを切って変更します。
- issue 番号を参照したプルリクエストを送ります。
WebAssembly/spec のほかの issue
-
難易度 1/5 1時間未満 初心者へのやさしさ 76/100
WebAssembly/spec#2300 ·
メンテナーはふだん 1 日以内に返信
-
難易度 4/5 3〜5日 初心者へのやさしさ 25/100
WebAssembly/spec#2279 · コメント 6 件 ·
メンテナーはふだん 1 日以内に返信
-
難易度 5/5 1週間以上 初心者へのやさしさ 35/100
WebAssembly/spec#2258 · コメント 4 件 · リアクション 1 件 ·
メンテナーはふだん 1 日以内に返信
-
[js-api] A mutable global import allocates a const global before LinkError対応中かも @chicoxyzzy が 18 日前に担当しました。 オープン
難易度 3/5 1〜2日 初心者へのやさしさ 58/100
WebAssembly/spec#2253 ·
メンテナーはふだん 1 日以内に返信
-
[spectec] Wasm 1.0: `$instantiate` missing premises対応中かも @rossberg が 44 日前に担当しました。 オープン
難易度 3/5 1〜2日 初心者へのやさしさ 68/100
WebAssembly/spec#2245 ·
メンテナーはふだん 1 日以内に返信
WebAssembly/spec の issue をすべて見る
似ている issue
-
alerts bug effort:S P2
難易度 2/5 1〜3時間 初心者へのやさしさ 76/100
nightscout/nocturne#2511 ·
メンテナーはふだん 1 日以内に返信
-
Python Volcengine provider returns failures instead of raising them対応中かも @Ricardo-M-L が今日担当しました。 オープン
難易度 2/5 1〜3時間 初心者へのやさしさ 79/100
agent-infra/sandbox#248 ·
-
Textractor leaves empty temporary files when remote retrieval fails対応中かも @HuaTNA が今日担当しました。 オープン
難易度 2/5 1〜3時間 初心者へのやさしさ 82/100
メンテナーはふだん 1 日以内に返信
-
難易度 2/5 1〜3時間 初心者へのやさしさ 78/100
PecanProject/pecan#4183 · コメント 1 件 ·
メンテナーはふだん 3 日以内に返信
-
難易度 2/5 1〜3時間 初心者へのやさしさ 66/100