Ir para conteúdo
  • Cadastre-se

dev botao

Regressão ACBrDFeXsXmlSec.pas


Dipold
  • Este tópico foi criado há 2360 dias atrás.
  • Talvez seja melhor você criar um NOVO TÓPICO do que postar uma resposta aqui.

Recommended Posts

Problema:

No método TDFeSSLXmlSignXmlSec.VerificarAssinatura(), a variável AXml foi alterada de AnsiString para String nesse commit, e quando executa a linha:

xmlParseDoc(PAnsiChar(AXml));

a conversão para PAnsiChar corrompe seu valor e o método xmlParseDoc() recebe como argumento um valor corrompido/lixo;

Solução:

Retornar a declaração para AnsiString;

Também sugiro alterar o seguinte trecho de código para mensagem ser mais específica do que erro genérico "Erro: Falha ao interpretar o XML "xmlParseDoc"":

    doc := xmlParseDoc(PAnsiChar(AXml));
    if ((doc = nil) or (xmlDocGetRootElement(doc) = nil)) then
    begin
      MsgErro := ACBrStr(cErrParseDoc);
      Exit;
    end;

Para:

var
  schemError: xmlErrorPtr;

    doc := xmlParseDoc(PAnsiChar(AXml));
    if ((doc = nil) or (xmlDocGetRootElement(doc) = nil)) then
    begin
      schemError := xmlGetLastError();
      if (schemError <> nil) then
        MsgErro := ACBrStr(cErrParseDoc) + #13#10 + IntToStr(schemError^.code) + ' - ' + schemError^.message
      else
        MsgErro := ACBrStr(cErrParseDoc);
      Exit;
    end;

 

 

Link para o comentário
Compartilhar em outros sites

Ficou alguma dúvida com relação ao meu post? 

Caso não tenha ficado claro, um teste simples pra entender que há perda de dados ao fazer cast para PAnsiChar entre String e AnsiString:

program Project1;

{$APPTYPE CONSOLE}

var
  AXMLAnsi: AnsiString;
  AXMLStr: String;
begin
  AXMLAnsi := '<?xml version="1.0" encoding="UTF-8"?>';
  AXMLStr  := '<?xml version="1.0" encoding="UTF-8"?>';

  WriteLn(PAnsiChar(AXMLAnsi)); //Imprime: <?xml version="1.0" encoding="UTF-8"?>
  WriteLn(PAnsiChar(AXMLStr));  //Imprime: <

  ReadLn;
end.

 

Link para o comentário
Compartilhar em outros sites

  • Este tópico foi criado há 2360 dias atrás.
  • Talvez seja melhor você criar um NOVO TÓPICO do que postar uma resposta aqui.

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...