`Parser::slice` and `Parser::slice_from` can trigger UB in safe Rust via unchecked slicing
Ninguém assumiu esta issue ainda.
Avaliação
- Dificuldade
- 2/5
- Tempo estimado
- 1-3 horas
- Facilidade para iniciantes
- 85/100
Direção de pesquisa
Inspecione src/tokenizer.rs, especialmente Parser::slice e Parser::slice_from, e acompanhe a construção de intervalos não seguros descrita na issue. Execute os testes existentes do repositório antes e depois da alteração e verifique se os intervalos invertidos, fora dos limites, redefinidos e entre parsers não chegam mais ao slicing sem verificação.
Escrita pelo modelo de indexação a partir do texto da issue.
Descrição
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.
- Linguagem predominante
- Rust
- Estrelas
- 874
- Forks
- 150
- Merge médio
- 9min
- PRs com merge (30d)
- 1
Preparar o ambiente
Este projeto não oferece contêiner de desenvolvimento, Dockerfile nem guia de contribuição, então a configuração fica por sua conta: comece pelo README e veja nosso guia da primeira contribuição para os passos gerais.
Primeiros passos
- Leia a issue inteira e depois o guia de contribuição do projeto.
- Comente na issue dizendo que vai assumir — evita que duas pessoas façam o mesmo trabalho.
- Faça um fork do repositório e trabalhe em uma branch.
- Abra um pull request que referencie o número da issue.
Mais de servo/rust-cssparser
-
cssparser-color: debug assertion in hsl_to_rgb for a hue that overflows f32Talvez já em andamento @BartWaardenburg assumiu há 1 dia. Aberta
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 64/100
servo/rust-cssparser#460 ·
-
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 88/100
servo/rust-cssparser#440 ·
-
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 85/100
servo/rust-cssparser#439 · 1 comentário ·
-
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 84/100
servo/rust-cssparser#434 ·
-
Dificuldade 4/5 3-5 dias Facilidade para iniciantes 45/100
servo/rust-cssparser#438 · 3 comentários · 1 reação ·
Todas as issues de servo/rust-cssparser
Issues semelhantes
-
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 85/100
farion1231/cc-switch#8829 ·
Mantenedores costumam responder em até 1 dia
-
bug ci good first issue
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 88/100
Mantenedores costumam responder em até 1 dia
-
Dificuldade 1/5 Menos de uma hora Facilidade para iniciantes 92/100
longbridge/gpui-kit#3677 ·
Mantenedores costumam responder em até 1 dia
-
E-pr-welcome
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 77/100
seanmonstar/reqwest#3121 · 2 comentários ·
Mantenedores costumam responder em até 1 dia
-
Dificuldade 1/5 Menos de uma hora Facilidade para iniciantes 68/100
ilya-zlobintsev/LACT#1235 ·
Mantenedores costumam responder em até 1 dia