Alexandre Felippeto Henzen Postado 13 Julho Postado 13 Julho Pessoal, Durante uma análise de consumo de memória na carga de certificados PFX, identifiquei um possível memory leak (na prática, vazamento de handle de HCERTSTORE) no arquivo ACBrDFeWinCrypt.pas, no método TDFeWinCrypt.CarregarCertificadoDeDadosPFX. O problema ocorre porque o método chama OpenSystemStore, que abre uma store e atribui seu handle a FpStore. Em seguida, a chamada a PFXDataToCertContextWinApi sobrescreve esse mesmo handle (passado por var) com o retorno de PFXImportCertStore, sem que a store anteriormente aberta seja fechada. Com isso, a cada carga de um certificado PFX, um handle de store permanece aberto. Realizei a seguinte alteração para evitar o vazamento: procedure TDFeWinCrypt.CarregarCertificadoDeDadosPFX; begin - OpenSystemStore; + { Não abre mais a Store do sistema neste caminho: o handle aberto por + "OpenSystemStore" era sobrescrito por "PFXImportCertStore" dentro de + "PFXDataToCertContextWinApi" (parâmetro var) sem nunca ser fechado, + ocasionando vazamento de um handle de store por carga de certificado PFX. } + if Assigned(FpStore) then + begin + CertCloseStore(FpStore, CERT_CLOSE_STORE_CHECK_FLAG); + FpStore := Nil; + end; + PFXDataToCertContextWinApi( FpDFeSSL.DadosPFX, FpDFeSSL.Senha, FpStore, Pelos testes realizados, a alteração elimina o vazamento sem impactar o carregamento do certificado PFX, já que PFXDataToCertContextWinApi é responsável por importar e inicializar a store que será utilizada posteriormente. Deixei em anexo o arquivo atualizado para analise, mas pode ser que ele não esteja atualizado com a ultima versão do arquivo completo. Ms é possível verificar o trecho mencionado. Gostaria da avaliação da equipe para verificar se essa correção faz sentido e, caso esteja de acordo, possa ser incorporada ao projeto. ACBrDFeWinCrypt.pas 1
Consultores Larissa.Santos Postado 13 Julho Consultores Postado 13 Julho Boa tarde, Foi criada a tarefa ACBR-9636 para avaliação. Obrigada pela contribuição!
Fundadores Daniel Simoes Postado 14 Julho Fundadores Postado 14 Julho a Store não é aberta várias vezes... se o Handle já estiver atribuído, o código não será executado... procedure TDFeWinCrypt.OpenSystemStore; var StoreFlag: DWORD; StoreProvider: LPCSTR; begin if (FpStore <> Nil) then Exit; Daniel Simões de Almeida O melhor TEF, é com o Projeto ACBr - Clique e Conheça Ajude o Projeto ACBr crescer - Assine o SAC (15) 2105-0750 (15)99790-2976.
Recommended Posts
Crie uma conta ou entre para comentar
Você precisar ser um membro para fazer um comentário
Criar uma conta
Crie uma nova conta em nossa comunidade. É fácil!
Crie uma nova contaEntrar
Já tem uma conta? Faça o login.
Entrar Agora