cssparser-color: debug assertion in hsl_to_rgb for a hue that overflows f32
@BartWaardenburg ya está trabajando en esto.
Desde el 22/10/2026.
- #461 de @BartWaardenburg — abierto
Evaluación
- Dificultad
- 2/5
- Tiempo estimado
- 1-3 horas
- Aptitud para principiantes
- 64/100
Línea de trabajo
Empieza en color/lib.rs, en normalize_hue y en la aserción indicada en la línea 307; después, revisa las pruebas de conversión de color hsl, hwb y lch. Reproduce el problema con las entradas de tono que provocan desbordamiento y que se enumeran, en una compilación de depuración, y compara el resultado con el comportamiento de CSS Color 4 y CSS Values 4 descrito aquí. El trabajo estará terminado cuando esas entradas no provoquen el pánico y produzcan los resultados especificados.
Escrito por el modelo de indexación a partir del texto del issue.
Descripción
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.
- Lenguaje dominante
- Rust
- Estrellas
- 874
- Forks
- 150
- Merge medio
- 9 min
- PR fusionados (30 d)
- 1
Preparar el entorno
Este proyecto no incluye contenedor de desarrollo, Dockerfile ni guía de contribución, así que la configuración corre por tu cuenta: empieza por su README y consulta nuestra guía para la primera contribución para los pasos generales.
Primeros pasos
- Lee el issue completo y luego la guía de contribución del proyecto.
- Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
- Haz un fork del repositorio y trabaja en una rama.
- Abre un pull request que haga referencia al número del issue.
Más de servo/rust-cssparser
-
bug
Dificultad 2/5 1-3 horas Aptitud para principiantes 85/100
servo/rust-cssparser#459 · 1 comentario ·
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 88/100
servo/rust-cssparser#440 ·
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 85/100
servo/rust-cssparser#439 · 1 comentario ·
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 84/100
servo/rust-cssparser#434 ·
-
Dificultad 4/5 3-5 días Aptitud para principiantes 45/100
servo/rust-cssparser#438 · 3 comentarios · 1 reacción ·
Todos los issues de servo/rust-cssparser
Issues similares
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 85/100
farion1231/cc-switch#8829 ·
Los mantenedores suelen responder en 1 día
-
bug ci good first issue
Dificultad 2/5 1-3 horas Aptitud para principiantes 88/100
Los mantenedores suelen responder en 1 día
-
Dificultad 1/5 Menos de una hora Aptitud para principiantes 92/100
longbridge/gpui-kit#3677 ·
Los mantenedores suelen responder en 1 día
-
E-pr-welcome
Dificultad 2/5 1-3 horas Aptitud para principiantes 77/100
seanmonstar/reqwest#3121 · 2 comentarios ·
Los mantenedores suelen responder en 1 día
-
Dificultad 1/5 Menos de una hora Aptitud para principiantes 68/100
ilya-zlobintsev/LACT#1235 ·
Los mantenedores suelen responder en 1 día