[interpreter] memory.grow on an i64 memory past 2^48 pages succeeds but allocates wrong amount (or crashes)
I maintainer di solito rispondono entro 1 giorno
Una pull request collegata è già stata integrata.
- #2290 di @rossberg — integrata
Valutazione
- Difficoltà
- 2/5
- Tempo stimato
- 1-3 ore
- Idoneità per principianti
- 76/100
Direzione di ricerca
Inizia da runtime/memory.ml, soprattutto valid_size intorno alle righe 27–38 e create/grow intorno alle righe 58–71, poi verifica i limiti della memoria WebAssembly citati. Riproduci nell’interprete i casi segnalati con 2^48 e 2^48 + 1 pagine. Il lavoro è completato quando la crescita i64 eccessiva viene rifiutata con -1, memory.size rimane invariato e il caso al limite esatto non provoca un arresto anomalo.
Scritto dal modello di indicizzazione a partire dal testo della issue.
Descrizione
(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.
- Lingua principale
- WebAssembly
- Stelle
- 3.5k
- Fork
- 541
- Merge medio
- 23h 36m
- PR unite (30g)
- 26
Preparare l'ambiente
- Nessun Dockerfile né file Docker Compose
- Nessun 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 WebAssembly/spec
-
Difficoltà 3/5 1-2 giorni Idoneità per principianti 66/100
WebAssembly/spec#2302 · 1 commento ·
I maintainer di solito rispondono entro 1 giorno
-
Difficoltà 4/5 3-5 giorni Idoneità per principianti 53/100
WebAssembly/spec#2301 · 7 commenti ·
I maintainer di solito rispondono entro 1 giorno
-
Difficoltà 4/5 3-5 giorni Idoneità per principianti 25/100
WebAssembly/spec#2279 · 6 commenti ·
I maintainer di solito rispondono entro 1 giorno
-
Difficoltà 5/5 Più di una settimana Idoneità per principianti 35/100
WebAssembly/spec#2258 · 4 commenti · 1 reazione ·
I maintainer di solito rispondono entro 1 giorno
-
[js-api] A mutable global import allocates a const global before LinkErrorForse già presa @chicoxyzzy l’ha presa 20 giorni fa. Aperta
Difficoltà 3/5 1-2 giorni Idoneità per principianti 58/100
WebAssembly/spec#2253 ·
I maintainer di solito rispondono entro 1 giorno
Tutte le issue di WebAssembly/spec
Issue simili
-
beginner good first issue growth
Difficoltà 2/5 1-3 ore Idoneità per principianti 82/100
BistaDinesh03/critique#161 ·
I maintainer di solito rispondono entro 1 giorno
-
bug help wanted low priority
Difficoltà 2/5 1-3 ore Idoneità per principianti 85/100
eugenioenko/ttt#1205 ·
I maintainer di solito rispondono entro 1 giorno
-
bug IO
Difficoltà 2/5 1-3 ore Idoneità per principianti 65/100
MrNeRF/LichtFeld-Studio#3824 ·
I maintainer di solito rispondono entro 1 giorno
-
UEFI: File::read/File::write report success on firmware error status when byte count is non-zeroApertaC-bug needs-triage O-UEFI T-libs
Difficoltà 2/5 1-3 ore Idoneità per principianti 72/100
I maintainer di solito rispondono entro 1 giorno
-
t:urlDecodeUni does not map U+3002 and U+FF61 to a dot, unlike ModSecurityForse già presa @fzipi l’ha presa oggi. Apertabug
Difficoltà 2/5 1-3 ore Idoneità per principianti 78/100
I maintainer di solito rispondono entro 1 giorno