`Parser::slice` and `Parser::slice_from` can trigger UB in safe Rust via unchecked slicing
Personne n'a encore pris cette issue.
Évaluation
- Difficulté
- 2/5
- Temps estimé
- 1-3 heures
- Accessibilité débutants
- 85/100
Piste de recherche
Inspecte src/tokenizer.rs, en particulier Parser::slice et Parser::slice_from, et retrace la construction des plages non sûres décrite dans l’issue. Exécute les tests existants du dépôt avant et après la modification, puis vérifie que les plages inversées, hors limites, réinitialisées et entre parseurs n’atteignent plus le slicing sans vérification.
Rédigé par le modèle d'indexation à partir du texte de l'issue.
Description
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.
- Langage dominant
- Rust
- Étoiles
- 874
- Forks
- 150
- Merge moyen
- 9 min
- PR mergées (30 j)
- 1
Préparer son environnement
Ce projet ne fournit ni conteneur de développement, ni Dockerfile, ni guide de contribution : l'installation est à votre charge. Commencez par son README, et consultez notre guide de la première contribution pour les étapes générales.
Par où commencer
- Lisez l'issue en entier, puis le guide de contribution du projet.
- Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
- Forkez le dépôt et travaillez sur une branche.
- Ouvrez une pull request qui référence le numéro de l'issue.
Autres issues de servo/rust-cssparser
-
cssparser-color: debug assertion in hsl_to_rgb for a hue that overflows f32Peut-être pris @BartWaardenburg l’a pris il y a 1 jour. Ouverte
Difficulté 2/5 1-3 heures Accessibilité débutants 64/100
servo/rust-cssparser#460 ·
-
Difficulté 2/5 1-3 heures Accessibilité débutants 88/100
servo/rust-cssparser#440 ·
-
Difficulté 2/5 1-3 heures Accessibilité débutants 85/100
servo/rust-cssparser#439 · 1 commentaire ·
-
Difficulté 2/5 1-3 heures Accessibilité débutants 84/100
servo/rust-cssparser#434 ·
-
Difficulté 4/5 3-5 jours Accessibilité débutants 45/100
servo/rust-cssparser#438 · 3 commentaires · 1 réaction ·
Toutes les issues de servo/rust-cssparser
Issues similaires
-
bug: workspace access hint suggests a --subject command that fails for hyphen-leading OIDC subjectsOuverte
Difficulté 2/5 1-3 heures Accessibilité débutants 78/100
Les mainteneurs répondent en général sous 1 jour
-
type: bug
Difficulté 2/5 1-3 heures Accessibilité débutants 78/100
Les mainteneurs répondent en général sous 1 jour
-
`last_error_thread_local_then_global` fails when it runs beside the `lumen_event_detail` testOuverteA-FFI C-Testing D-Straightforward S-Ready
Difficulté 2/5 1-3 heures Accessibilité débutants 75/100
Les mainteneurs répondent en général sous 1 jour
-
docs priority:P3 size:XS
Difficulté 1/5 Moins d'une heure Accessibilité débutants 88/100
Les mainteneurs répondent en général sous 1 jour
-
Appimage ConventionsOuverteenhancement
Difficulté 2/5 1-3 heures Accessibilité débutants 72/100
Les mainteneurs répondent en général sous 1 jour