Repository navigation
fix(fpc): corrige hash de headers com range e overflow checking - #620
Merged
regyssilveira merged 1 commit intoOct 20, 2026
Merged
regyssilveira merged 1 commit into
regyssilveira merged 1 commit into
Conversation
This was referenced Oct 20, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Problema
O DJB2 de
THorseHeaderComparer.GetHashCodedependia do truncamento implícito de valores maiores que 32 bits. Com range checking ativado no FPC, o cálculo de headers comuns comoContent-TypeeAuthorizationpodia lançarERangeError, impedindo operações do dicionário e a extração dos headers da requisição.A falha foi reproduzida no FPC 3.2.2/Linux x86_64 com
-Cre com-Cr -Co. Nessa plataforma, ativar apenas-Conão reproduziu a exceção; o problema observado foi o erro de faixa ao converter o resultado paraDWord.Solução
O cálculo usa um intermediário
QWorde aplica explicitamente a máscara de 32 bits antes da conversão:Isso preserva o DJB2 módulo 2³² e seus hashes anteriores. O intermediário é limitado a
(2³² - 1) * 33 + Ord(LChar), e o valor convertido já está dentro da faixa deDWord. O contrato deIEqualityComparer<string>continua retornandoDWord, sem depender de desabilitar as verificações de range/overflow e sem introduzir alocações de strings no cálculo.Testes de regressão
Adiciona
tests/fpc-header-hash, com 4 grupos e 63 verificações:MaxInt, chave vazia e equivalência entre maiúsculas/minúsculas ASCII.Content-TypeeHostporTHorseCoreParamHeader.GetHeadersa partir de uma requisição FPC.O script recompila o teste e as units do Horse com
-B -Cr -Co, habilita diagnóstico de memória com-ghe retorna erro em falhas de compilação, verificações ou blocos não liberados. O programa também recusa compilação sem range e overflow checking ativados.Antes da correção, os quatro grupos falharam com
ERangeError, e o teste retornou código 1. Após a correção, todos passaram:-Cr -Co-Cr -CoNenhum vazamento foi reportado pelo
heaptrcnos testes FPC.git diff --checktambém passou.Os testes FPC exercitam as classes diretamente, sem abrir servidor HTTP; a validação HTTP acima foi executada em Delphi. A expressão corrigida é exclusiva do caminho FPC.
CI e reprodução
Integra a regressão ao job FPC estável e ao job FPC trunk existente, executando as configurações padrão e Epoll em ambos. A execução local cobriu FPC 3.2.2; os resultados de trunk serão fornecidos pelos checks desta PR.