cssparser-color: debug assertion in hsl_to_rgb for a hue that overflows f32
Bewertung
- Schwierigkeit
- 2/5
- Geschätzter Aufwand
- 1-3 Stunden
- Anfängerfreundlichkeit
- 64/100
Rechercherichtung
Beginne in color/lib.rs bei normalize_hue und der Assertion, die in Zeile 307 gemeldet wird, und überprüfe dann die Tests für die hsl-, hwb- und lch-Farbkonvertierung. Reproduziere das Problem mit den aufgeführten überlaufenden Hue-Eingaben in einem Debug-Build und vergleiche die Ausgabe mit dem hier beschriebenen Verhalten gemäß CSS Color 4 und CSS Values 4. Fertig ist die Arbeit, wenn diese Eingaben keinen Panic auslösen und die angegebenen Ergebnisse liefern.
Vom Indexierungsmodell aus dem Issue-Text verfasst.
Beschreibung
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.
- Vorherrschende Sprache
- Rust
- Sterne
- 874
- Forks
- 150
- Ø Merge
- 9 Min.
- Gemergte PRs (30 T.)
- 1
Entwicklungsumgebung
Dieses Projekt bietet weder Dev-Container noch Dockerfile noch Beitragsleitfaden – die Einrichtung liegt bei Ihnen. Beginnen Sie mit der README; die allgemeinen Schritte stehen in unserem Leitfaden für den ersten Beitrag.
Erste Schritte
- Lesen Sie das ganze Issue und danach den Beitragsleitfaden des Projekts.
- Schreiben Sie ins Issue, dass Sie es übernehmen — das erspart doppelte Arbeit.
- Forken Sie das Repository und arbeiten Sie in einem Branch.
- Öffnen Sie einen Pull Request, der die Issue-Nummer nennt.
Mehr aus servo/rust-cssparser
-
bug
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 85/100
servo/rust-cssparser#459 · 1 Kommentar ·
-
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 88/100
servo/rust-cssparser#440 ·
-
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 85/100
servo/rust-cssparser#439 · 1 Kommentar ·
-
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 84/100
servo/rust-cssparser#434 ·
-
Schwierigkeit 4/5 3-5 Tage Anfängerfreundlichkeit 45/100
servo/rust-cssparser#438 · 3 Kommentare · 1 Reaktion ·
Alle Issues in servo/rust-cssparser
Ähnliche Issues
-
area:io kernel-paused needs-triage
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 72/100
bherbruck/solvecraft#7854 ·
-
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 82/100
transit-audio/transit#159 ·
-
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 76/100
HakanSeven12/OpenCADStudio#2257 · 1 Kommentar ·
Maintainer antworten meist innerhalb von 1 Tag
-
priority: low ui
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 72/100
storytold/photocraft#9884 · 1 Kommentar ·
Maintainer antworten meist innerhalb von 1 Tag
-
triage: new type: bug
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 67/100
Jagalite/superseedr#376 ·
Maintainer antworten meist innerhalb von 1 Tag