Hacktoberfest 2026: as issues que os mantenedores marcaram para outubro, abertas e boas para iniciantes. Ver issues do Hacktoberfest

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

Aberta Para iniciantes
#459 1 comentário 0 reações 0 responsáveis Ver no GitHub

Ninguém assumiu esta issue ainda.

Avaliação

Dificuldade
2/5
Tempo estimado
1-3 horas
Facilidade para iniciantes
85/100
Tipo de issue
Bug
Clareza
Claramente especificada
Status de atividade
Ativa
Stack de tecnologia
rust
Domínio
security

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

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.

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

  1. Leia a issue inteira e depois o guia de contribuição do projeto.
  2. Comente na issue dizendo que vai assumir — evita que duas pessoas façam o mesmo trabalho.
  3. Faça um fork do repositório e trabalhe em uma branch.
  4. Abra um pull request que referencie o número da issue.

Mais de servo/rust-cssparser

Todas as issues de servo/rust-cssparser

Issues semelhantes

Mais issues de Rust

Receba novas issues na sua caixa de entrada

Um resumo curto de issues do GitHub para quem está começando.