`Parser::slice` and `Parser::slice_from` can trigger UB in safe Rust via unchecked slicing
Dieses Issue hat noch niemand übernommen.
Bewertung
- Schwierigkeit
- 2/5
- Geschätzter Aufwand
- 1-3 Stunden
- Anfängerfreundlichkeit
- 85/100
Rechercherichtung
Untersuche src/tokenizer.rs, insbesondere Parser::slice und Parser::slice_from, und verfolge die im Issue beschriebene Konstruktion unsicherer Bereiche. Führe vor und nach der Änderung die vorhandenen Tests des Repositorys aus und überprüfe dann, dass invertierte, außerhalb der Grenzen liegende, zurückgesetzte und parserübergreifende Bereiche nicht mehr ungeprüftes Slicing erreichen.
Vom Indexierungsmodell aus dem Issue-Text verfasst.
Beschreibung
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.
- Vorherrschende Sprache
- Rust
- Sterne
- 874
- Forks
- 150
- Ø Merge
- 9 Min.
- Gemergte PRs (30 T.)
- 1
Entwicklungsumgebung
Dieses Projekt bietet weder Dev-Container noch Dockerfile noch Beitragsleitfaden – die Einrichtung liegt bei Ihnen. Beginnen Sie mit der README; die allgemeinen Schritte stehen in unserem Leitfaden für den ersten Beitrag.
Erste Schritte
- Lesen Sie das ganze Issue und danach den Beitragsleitfaden des Projekts.
- Schreiben Sie ins Issue, dass Sie es übernehmen — das erspart doppelte Arbeit.
- Forken Sie das Repository und arbeiten Sie in einem Branch.
- Öffnen Sie einen Pull Request, der die Issue-Nummer nennt.
Mehr aus servo/rust-cssparser
-
cssparser-color: debug assertion in hsl_to_rgb for a hue that overflows f32Evtl. vergeben @BartWaardenburg hat das vor 1 Tag übernommen. Offen
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 64/100
servo/rust-cssparser#460 ·
-
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 88/100
servo/rust-cssparser#440 ·
-
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 85/100
servo/rust-cssparser#439 · 1 Kommentar ·
-
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 84/100
servo/rust-cssparser#434 ·
-
Schwierigkeit 4/5 3-5 Tage Anfängerfreundlichkeit 45/100
servo/rust-cssparser#438 · 3 Kommentare · 1 Reaktion ·
Alle Issues in servo/rust-cssparser
Ähnliche Issues
-
bug: workspace access hint suggests a --subject command that fails for hyphen-leading OIDC subjectsOffen
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 78/100
Maintainer antworten meist innerhalb von 1 Tag
-
type: bug
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 78/100
Maintainer antworten meist innerhalb von 1 Tag
-
A-FFI C-Testing D-Straightforward S-Ready
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 75/100
Maintainer antworten meist innerhalb von 1 Tag
-
docs priority:P3 size:XS
Schwierigkeit 1/5 Unter einer Stunde Anfängerfreundlichkeit 88/100
Maintainer antworten meist innerhalb von 1 Tag
-
Appimage ConventionsOffenenhancement
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 72/100
Maintainer antworten meist innerhalb von 1 Tag