`Parser::slice` and `Parser::slice_from` can trigger UB in safe Rust via unchecked slicing
Nessuno ha ancora preso questa issue.
Valutazione
- Difficoltà
- 2/5
- Tempo stimato
- 1-3 ore
- Idoneità per principianti
- 85/100
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
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.
- 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
- Leggi tutta la issue e poi la guida ai contributi del progetto.
- Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
- Fai un fork del repository e lavora su un branch.
- Apri una pull request che faccia riferimento al numero della issue.
Altre issue di servo/rust-cssparser
-
cssparser-color: debug assertion in hsl_to_rgb for a hue that overflows f32Forse già presa @BartWaardenburg l’ha presa oggi. Aperta
Difficoltà 2/5 1-3 ore Idoneità per principianti 64/100
servo/rust-cssparser#460 ·
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 88/100
servo/rust-cssparser#440 ·
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 85/100
servo/rust-cssparser#439 · 1 commento ·
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 84/100
servo/rust-cssparser#434 ·
-
Difficoltà 4/5 3-5 giorni Idoneità per principianti 45/100
servo/rust-cssparser#438 · 3 commenti · 1 reazione ·
Tutte le issue di servo/rust-cssparser
Issue simili
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 66/100
I maintainer di solito rispondono entro 1 giorno
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 62/100
foxglove/mcap#1907 · 1 commento ·
I maintainer di solito rispondono entro 1 giorno
-
Difficoltà 1/5 Meno di un'ora Idoneità per principianti 66/100
I maintainer di solito rispondono entro 1 giorno
-
good first issue help wanted r-feature
Difficoltà 2/5 1-3 ore Idoneità per principianti 82/100
servo/rust-smallvec#792 ·
I maintainer di solito rispondono entro 1 giorno
-
Difficoltà 1/5 Meno di un'ora Idoneità per principianti 88/100
I maintainer di solito rispondono entro 1 giorno