Zitat:
WARNINGS
The use of temporary variable is mandatory.
Du hast doch schon eine
p: TBytes
Variable in deiner Testfunktion drin. Nutze sie doch!
Jepp, das p ist da noch drin, weil ich gedacht hatte, ich hätte verstanden, was mir die Doku sagen will. Ich hatte das dann so umgesetzt:
Delphi-Quellcode:
procedure TForm2.ButtonDecodeClick(Sender: TObject);
var
byteArray, p: TBytes;
pr: PX509;
bytePubKey: TBytes;
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.');
p:=byteArray; // <---- Hier die wesentliche Änderung!
pr:=d2i_X509(nil,@@p[0],length(byteArray)); // <---- und natürlich hier
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;
Das hilft auch insofern, weil ByteArray dann seinen Inhalt behält und nicht durch d2i_x509 verbogen wird und somit dann auch - denke ich mal - korrekt freigegeben wird. Das Speicherleck beim Beenden kommt trotzdem ganz genauso.
Ein zusätzliches SetLength(p,0) macht ja eigentlich keinen Sinn, denn das zeigt auf keinen von mir reservierten Speicher und entsprechend ändert es auch nichts.