Hacktoberfest 2026: le issue che i maintainer hanno segnato per ottobre, aperte e adatte ai principianti. Sfoglia le issue Hacktoberfest

`Parser::slice` and `Parser::slice_from` can trigger UB in safe Rust via unchecked slicing

Aperta Adatta ai principianti
#459 1 commento 0 reazioni 0 assegnatari Vedi su GitHub

Nessuno ha ancora preso questa issue.

Valutazione

Difficoltà
2/5
Tempo stimato
1-3 ore
Idoneità per principianti
85/100
Tipo di issue
Bug
Chiarezza
Specificata chiaramente
Stato di attività
Attiva
Stack tecnologico
rust
Ambito
security

Direzione di ricerca

Esamina src/tokenizer.rs, in particolare Parser::slice e Parser::slice_from, e segui la costruzione degli intervalli non sicuri descritta nell’issue. Esegui i test esistenti del repository prima e dopo la modifica, quindi verifica che gli intervalli invertiti, fuori dai limiti, reimpostati e tra parser diversi non raggiungano più lo slicing senza controlli.

Scritto dal modello di indicizzazione a partire dal testo della issue.

Descrizione

bug

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:

  1. Passing an inverted range p1..p0 where p1 > p0 (both is_char_boundary assertions still pass in debug builds, and end - start underflows in get_unchecked).
  2. Calling parser.reset(&saved_state) to rewind the parser position and then calling parser.slice_from(later_pos).
  3. Passing a SourcePosition obtained from another Parser with a longer input string in release builds where debug_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.

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

  1. Leggi tutta la issue e poi la guida ai contributi del progetto.
  2. Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
  3. Fai un fork del repository e lavora su un branch.
  4. Apri una pull request che faccia riferimento al numero della issue.

Altre issue di servo/rust-cssparser

Tutte le issue di servo/rust-cssparser

Issue simili

Altre issue su Rust

Ricevi le nuove issue nella tua casella

Un breve riepilogo di issue GitHub adatte ai principianti.