`Parser::slice` and `Parser::slice_from` can trigger UB in safe Rust via unchecked slicing
Nadie ha tomado este issue todavía.
Evaluación
- Dificultad
- 2/5
- Tiempo estimado
- 1-3 horas
- Aptitud para principiantes
- 85/100
Línea de trabajo
Inspecciona src/tokenizer.rs, especialmente Parser::slice y Parser::slice_from, y rastrea la construcción de rangos insegura descrita en el issue. Ejecuta las pruebas existentes del repositorio antes y después del cambio y luego verifica que los rangos invertidos, fuera de los límites, restablecidos y entre parsers ya no lleguen a un slicing sin comprobaciones.
Escrito por el modelo de indexación a partir del texto del issue.
Descripción
Parser::slice (and Parser::slice_from) in src/tokenizer.rs calls self.input.get_unchecked(range.start.0..range.end.0) without verifying range.start.0 <= range.end.0 or range.end.0 <= self.input.len():
#[inline]
pub fn slice(&self, range: Range<SourcePosition>) -> &'a str {
debug_assert!(self.input.is_char_boundary(range.start.0));
debug_assert!(self.input.is_char_boundary(range.end.0));
unsafe { self.input.get_unchecked(range.start.0..range.end.0) }
}
Safe callers can trigger undefined behavior without unsafe:
- Passing an inverted range
p1..p0wherep1 > p0(bothis_char_boundaryassertions still pass in debug builds, andend - startunderflows inget_unchecked). - Calling
parser.reset(&saved_state)to rewind the parser position and then callingparser.slice_from(later_pos). - Passing a
SourcePositionobtained from anotherParserwith a longer input string in release builds wheredebug_assert!is disabled.
Replacing unsafe { self.input.get_unchecked(range.start.0..range.end.0) } with &self.input[range.start.0..range.end.0] avoids the soundness issue.
- 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
-
cssparser-color: debug assertion in hsl_to_rgb for a hue that overflows f32Posiblemente ocupada @BartWaardenburg la tomó hace 1 día. Abierto
Dificultad 2/5 1-3 horas Aptitud para principiantes 64/100
servo/rust-cssparser#460 ·
-
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
-
checkpoint/verify/rebuild_indexes on a thread holding a WriteTransaction deadlock instead of INT-001Abiertobug known-issue
Dificultad 2/5 1-3 horas Aptitud para principiantes 74/100
project-minigraf/minigraf#734 ·
Los mantenedores suelen responder en 1 día
-
Dificultad 1/5 Menos de una hora Aptitud para principiantes 88/100
Los mantenedores suelen responder en 4 días
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 70/100
Los mantenedores suelen responder en 1 día
-
bug CLI documentation
Dificultad 2/5 1-3 horas Aptitud para principiantes 67/100
openai/codex#56630 · 3 comentarios · 3 reacciones ·
Los mantenedores suelen responder en 1 día
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 64/100
DayuanJiang/PecoFence#139 ·
Los mantenedores suelen responder en 1 día