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!