Ir para conteúdo
  • Cadastre-se

galegoga

Membros
  • Total de ítens

    41
  • Registro em

  • Última visita

Últimos Visitantes

O bloco dos últimos visitantes está desativado e não está sendo visualizado por outros usuários.

galegoga's Achievements

Contributor

Contributor (5/14)

  • Dedicated Rare
  • Collaborator Rare
  • Reacting Well Rare
  • First Post
  • Conversation Starter

Recent Badges

12

Reputação

  1. Arquivo ACBrCTeWebServices.pas atualizado Refere-se a primeira postagem. ACBrCTeWebServices.pas
  2. Bom dia! Além desse ajuste é necessário ajustar o arquivo pcnRetDistDFeInt. if (oLeitorInfZip.rExtrai(1, LowerCase(FtpDFe) + 'Proc') <> '') or (oLeitorInfZip.rExtrai(1, LowerCase(FtpDFe) + 'OSProc') <> '') or (oLeitorInfZip.rExtrai(1, LowerCase(FtpDFe) + 'SimpProc') <> '') or (oLeitorInfZip.rExtrai(1, 'GTVeProc') <> '') then begin FdocZip.Items[i].XML := InserirDeclaracaoXMLSeNecessario(oLeitorInfZip.Grupo); Ajuste no arquivo em anexo. @douglaswf, após o ajuste o sistema parou de apresentar erro mas está havendo perda de arquivo se você utiliza o código padrão acbr para salvar a distribuição. Você pode efetuar o ajuste ou aguardar os moderadores ajustarem. São dois ajustes esse e o acima. pcnRetDistDFeInt.pas
  3. Boa tarde, @Italo Giurizzato Junior! Foi postado um ajuste seu na distribuição cte. Veja aqui. O ajuste funcionou, agora está faltando adicionar o novo valor enumerado (schprocCTeSimp) na rotina que salva os documentos na pasta, localizado no método TDistribuicaoDFe.TratarResposta acredito o código deva ficar da seguinte forma: schprocCTe, schprocCTeOS, schprocGTVe, schprocCTeSimp: FNomeArq := FretDistDFeInt.docZip.Items[I].resDFe.chDFe + '-cte.xml'; Segue em anexo o arquivo com a correção. ACBrCTeWebServices.pas
  4. @Arimateia Jr Blz, Vou dar um olhada nesses links.
  5. Boa tarde, Arimateia! Fiz o teste e funcionou muito bem. Você conseguiu através do link em que postei ? Pergunto porque esse método "OPENSSL_sk_pop_free" não está informado, lá falava sobre "sk_X509_pop_free". Ele são similares ou equivalentes ? (Levando em conta que o artigo no fórum já tem 22 anos e muita coisa pode ter mudado).
  6. Boa tarde, Daniel. Você chegou a ver o post acima ? No dia em que postei tive um problema e acabei quebrando ele em dois. Tentei editar para ficar em um só, mas o tempo de edição havia expirado.
  7. Continuação do post acima // Set Certificate Verification chain if Result and (ca <> nil) then SslCtxCtrl(Fctx, SSL_CTRL_CHAIN, 0, ca); // <---- AQUI Adicionei esse código e fiz os testes e vi que parou de vazar memória. meu código de teste foi (loop de 1000): procedure TForm2.MetodoTeste(ALoop: Integer); var vDFeSSL: TDFeSSL; vCT: Integer; vSenha: String; vFileName: String; begin vFileName := edtPfxFileName.Text; vSenha := edtSenhaPFX.Text; for vCT := 1 to ALoop do begin vDFeSSL := TDFeSSL.Create; try vDFeSSL.SSLCryptLib := cryOpenSSL; vDFeSSL.SSLType := LT_TLSv1_2; vDFeSSL.DadosPFX := LoadCertificado(vFileName); vDFeSSL.Senha := AnsiString(vSenha); vDFeSSL.CarregarCertificado; finally vDFeSSL.Free; end; end; end; Realmente os sistema com ReportMemoryLeaksOnShutdown := True; não acusa nada. Mas o memory ocorre. Aproveitando essa discussão. Acho que você não acompanhou a discussão desde o início. Digo isso porque quando tive o problema cheguei a achar algo parecido com o meu problema. chequei a mencionar no fórum antes de propor essa modificação no código. Um certo usuário mencionava despejo de memória relacionado a variável "Ca". A solução veio do Dr. Stephen Henson, que informava que ele devia chamar sk_X509_pop_free(Ca, X509_free) ao final. Achei que fosse isso. No acbr também possui ela com o nome SkX509PopFree, mas ela nunca é executada por que me parece que ela não existe na dll. _SkX509PopFree dentro de ssl_openssl_lib.pas sempre está nula. A solução é antiga, acho que no inicio dos anos 2000. O link é : https://openssl-users.openssl.narkive.com/F1OAAID0/pkcs12-memory-leak#post2 Vou adicionar o código fonte de teste. Se precisar do certificado digital é só me falar. PrjReadPfx02.zip
  8. Boa tarde, Daniel! Fiz o teste e continua apresentando o problema. Primeiramente quero dizer que meu conhecimento referente as bibliotecas OpenSSL é zero. Também pouco sei sobre certificado digital. Nesses aspectos sou usuário final, dessa forma eu não tenho a capacidade de discutir os detalhes internos da biblioteca. Mas vou te passar os passos que levaram até esse ponto. Desenvolvi uma aplicação para consultar a Distribuição, é um serviço que roda 24 horas, com mais de 1000 empresas, mas acho que certificados são uns 500, visto que tem muitas filiais. No decorrer do tempo a aplicação ia crescendo até ficar sem memória. Fiz um rastreio, fui isolando as partes até que descobri que o despejo era quando acessava a certificado. Um detalhe importante é que o problema ocorre somente com alguns certificados. Depois que descobri em qual unit (ACBrDFeOpenSSL.pas) estava o problema eu comecei estudar o que estava sendo criado e que ficava para trás. Nesse processo descobrir a unit ssl_openssl.pas na qual me ajudou, fui comparando o código vendo as diferenças até que cheguei a um certo ponto, onde existia um código na ssl_openssl.pas que não existia na unit do acbr. O código era:
  9. Arquivo em anexo. ACBrDFeOpenSSL.pas
  10. Boa tarde! No meus testes essa modificação não funcionou. Continua vazando memória. A linha 576, código: SslCtxCtrl(Fctx, SSL_CTRL_CHAIN, 0, ca); não está sendo executada de acordo com a condicional estabelecida. Por que ela não pode ser executada somente através da condicional "if Result and (ca <> nil) then" ? porque ela tem que depender da condicional "if LibVersionIsGreaterThan1_0_0 then begin" ser falsa ? Assim não funcionou: // Set Certificate Verification chain if Result and (ca <> nil) then begin if LibVersionIsGreaterThan1_0_0 then begin iTotal := OPENSSL_sk_num(ca); if iTotal > 0 then begin Store := SSL_CTX_get_cert_store(Fctx); for I := 0 to iTotal - 1 do begin certx := OPENSSL_sk_value(ca, I); if certx <> nil then begin if X509_STORE_add_cert(Store, pX509(certx)) = 0 then begin // already exists end; //X509_free(Cert); end; end; end; end else SslCtxCtrl(Fctx, SSL_CTRL_CHAIN, 0, ca); end; Assim funcionou: // Set Certificate Verification chain if Result and (ca <> nil) then begin if LibVersionIsGreaterThan1_0_0 then begin iTotal := OPENSSL_sk_num(ca); if iTotal > 0 then begin Store := SSL_CTX_get_cert_store(Fctx); for I := 0 to iTotal - 1 do begin certx := OPENSSL_sk_value(ca, I); if certx <> nil then begin if X509_STORE_add_cert(Store, pX509(certx)) = 0 then begin // already exists end; //X509_free(Cert); end; end; end; end; SslCtxCtrl(Fctx, SSL_CTRL_CHAIN, 0, ca); end;
  11. Sim, vou efetuar os testes. Reporto assim que tiver os resultados.
  12. Desculpe, só vi sua mensagem agora. Devo ter recebido o e-mail de notificação do fórum, mas também não vi. Segue em anexo o arquivo atualizado. Modificações somente no arquivo ACBrDFeOpenSSL.pas. ACBrDFeOpenSSL.pas
  13. Seria bom que colocasse esse ajuste, recentemente tive que atualizar o ACBr e tive que modificar novamente a unit. Não consegui solucionar utilizando a versão que utiliza componentes do Windows. Ele gera diversos arquivos numa pasta do AppData ficando enorme. Usando o OpenSSL consegui resolver o problema que consumia muita memória, em uma hora de uso a aplicação consumia 500MB só de leitura de certificado e continuava a crescer até dar crash no aplicativo.
  14. Boa noite! Segue o arquivo com a sugestão de correção para evitar memoryLeak na leitura de alguns certificados. ACBrDFeOpenSSL.pas
×
×
  • 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.