Ir para conteúdo
  • Cadastre-se

Recommended Posts

Postado

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

  • Curtir 1
  • Larissa.Santos changed the title to [ACBR-9636] Contribuição - Correção de problema memory leak relacionado á certificado
  • Fundadores
Postado

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;


                

Consultor SAC ACBr

Daniel Simões de Almeida
O melhor TEF, é com o Projeto ACBr - Clique e Conheça
Ajude o Projeto ACBr crescer - Assine o SAC

Projeto ACBr     Telefone:(15) 2105-0750 WhatsApp(15)99790-2976.

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 conta

Entrar

Já tem uma conta? Faça o login.

Entrar Agora
×
×
  • Criar Novo...

Informação Importante

Colocamos cookies em seu dispositivo para ajudar a tornar este site melhor. Você pode ajustar suas configurações de cookies, caso contrário, assumiremos que você está bem para continuar.

The popup will be closed in 10 segundos...