Einzelnen Beitrag anzeigen

Bbommel

Registriert seit: 27. Jun 2007
Ort: Köln
655 Beiträge
 
Delphi 12 Athens
 
#13

AW: OpenSSL - MemoryLeak bei Verwendung eines X509-Zertifikats

  Alt 28. Nov 2020, 21:05
So geht es:

Delphi-Quellcode:
procedure TForm2.ButtonDecodeClick(Sender: TObject);

var
  byteArray: TBytes;
  pr: PX509;
  bytePubKey: TBytes;
  PArray: Pointer; // <--- den Pointer auf das Byte-Array auch wirklich als Pointer deklarieren
  pubKey: string;
  bio: PBIO;

begin
  byteArray:=TNetEncoding.Base64.DecodeStringToBytes(MemoKey.Lines.Text);
  MemoStatus.Lines.Add('base decoded. Length: '+length(byteArray).ToString);
  if IdSSLOpenSSLHeaders.Load then begin
    MemoStatus.Lines.Add('openssl loaded.');
    PArray:=@byteArray[0]; // <--- Pointer auf den Anfang des Arrays setzen
    pr:=d2i_X509(nil,@PArray,length(byteArray)); // <--- Pointer auf den Pointer an die Funktion übergeben
    if pr<>nil then begin
      MemoStatus.Lines.Add('X509 read.');
      MemoStatus.Lines.Add('Name: '+X509_NAME_oneline(X509_get_subject_name(pr),nil,0));
      MemoStatus.Lines.Add('Public Key Length: '+pr.cert_info.key.public_key.length.ToString);
      MemoStatus.Lines.Add('Issuer name: '+X509_NAME_oneline(X509_get_issuer_name(pr),nil,0));
      bio:=BIO_new(BIO_s_mem);
      PEM_write_bio_X509(bio,pr);
      SetLength(bytePubKey,bio.num_write);
      BIO_read(bio,bytePubKey,BIo.num_write);
      pubKey:=string(PAnsiChar(@bytePubKey[0]));
      MemoPEM.Lines.Text:=pubKey;
      BIO_free(bio);
      X509_free(pr);
      SetLength(bytePubKey,0);
    end else
      MemoStatus.Lines.Add('Failed read X509.');
  end;
  SetLength(byteArray,0);
end;
In der Variante bekomme ich kein Speicherleck mehr. Danke fürs In-die-richtige-Richtung-Schieben.

Vermutlich kommt irgendwas im Speichermanagement durcheinander, wenn man die temporäre Variable auch als ByteArray und nicht als Pointer deklariert. Mal so geraten. So funktioniert es jedenfalls. Schönes Rest-Wochenende allen, die hier reingucken!
  Mit Zitat antworten Zitat