cssparser-color: debug assertion in hsl_to_rgb for a hue that overflows f32
Valutazione
- Difficoltà
- 2/5
- Tempo stimato
- 1-3 ore
- Idoneità per principianti
- 64/100
Direzione di ricerca
Inizia in color/lib.rs, da normalize_hue e dall’asserzione segnalata alla riga 307, poi controlla i test per la conversione dei colori hsl, hwb e lch. Riproduci il problema con gli input di tonalità in overflow elencati in una build di debug e confronta l’output con il comportamento di CSS Color 4 e CSS Values 4 descritto qui. Il lavoro è concluso quando quegli input non causano il panic e producono i risultati specificati.
Scritto dal modello di indicizzazione a partire dal testo della issue.
Descrizione
A hue that overflows f32 makes normalize_hue return NaN. Examples are hwb(1e40 0% 0%) and hsl(1e40 50% 50%). In a debug build, to_css_string() on the parsed color then panics:
panicked at color/lib.rs:307:5:
assertion failed: (0.0..=1.0).contains(&hue)
hwb(1e30 0% 0%) does not panic, because 1e30 still fits in an f32.
normalize_hue computes hue - 360.0 * (hue / 360.0).floor(). For an infinite hue, this is inf - inf, which is NaN. A release build does not panic, but the output is wrong:
| Input | Release output |
|---|---|
hwb(1e40 0% 0%) |
rgb(0, 0, 0) |
hsl(1e40 50% 50%) |
rgb(64, 64, 64) |
lch(50% 30 1e40) |
lch(50 30 calc(NaN)) |
The spec gives the expected result. CSS Color 4 says that hsl(calc(infinity) 0 0) and hsl(calc(-infinity) 0 0) normalize the hue to 0 degrees. CSS Values 4 censors NaN to 0. So hwb(1e40 0% 0%) must give rgb(255, 0, 0).
Reproduced on main at 9f3cedd.
Related: #167 is about non-finite numbers from the tokenizer in general.
Found by fuzzing Fallow (https://github.com/fallow-rs/fallow) with OSS-Fuzz.
- Lingua principale
- Rust
- Stelle
- 874
- Fork
- 150
- Merge medio
- 9m
- PR unite (30g)
- 1
Preparare l'ambiente
Questo progetto non fornisce container di sviluppo, Dockerfile né guida per i contributori, quindi l'ambiente è a tuo carico: parti dal suo README e consulta la nostra guida al primo contributo per i passaggi generali.
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 servo/rust-cssparser
-
bug
Difficoltà 2/5 1-3 ore Idoneità per principianti 85/100
servo/rust-cssparser#459 · 1 commento ·
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 88/100
servo/rust-cssparser#440 ·
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 85/100
servo/rust-cssparser#439 · 1 commento ·
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 84/100
servo/rust-cssparser#434 ·
-
Difficoltà 4/5 3-5 giorni Idoneità per principianti 45/100
servo/rust-cssparser#438 · 3 commenti · 1 reazione ·
Tutte le issue di servo/rust-cssparser
Issue simili
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 62/100
foxglove/mcap#1907 · 1 commento ·
I maintainer di solito rispondono entro 1 giorno
-
Difficoltà 1/5 Meno di un'ora Idoneità per principianti 66/100
I maintainer di solito rispondono entro 1 giorno
-
good first issue help wanted r-feature
Difficoltà 2/5 1-3 ore Idoneità per principianti 82/100
servo/rust-smallvec#792 ·
I maintainer di solito rispondono entro 1 giorno
-
A-Unicode C-bug P-low
Difficoltà 2/5 1-3 ore Idoneità per principianti 70/100
rust-lang/rustfmt#7210 · 1 commento ·
I maintainer di solito rispondono entro 1 giorno
-
callTracer with withLog: true includes logs from a reverted top-level call (diverges from geth)Aperta
Difficoltà 2/5 1-3 ore Idoneità per principianti 82/100
paradigmxyz/revm-inspectors#570 ·
I maintainer di solito rispondono entro 1 giorno