Alexandre Felippeto Henzen Postado Segunda as 15:22 Postado Segunda as 15:22 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 Segunda as 17:53 Consultores Postado Segunda as 17:53 Boa tarde, Foi criada a tarefa ACBR-9636 para avaliação. Obrigada pela contribuição!
Fundadores Daniel Simoes Postado Terça as 16:33 Fundadores Postado Terça as 16:33 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