![]() |
AW: OpenSSL - MemoryLeak bei Verwendung eines X509-Zertifikats
Zitat:
Delphi-Quellcode:
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.
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; 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. |
AW: OpenSSL - MemoryLeak bei Verwendung eines X509-Zertifikats
OPENSSL_free(p) probiert?
|
AW: OpenSSL - MemoryLeak bei Verwendung eines X509-Zertifikats
So geht es:
Delphi-Quellcode:
In der Variante bekomme ich kein Speicherleck mehr. Danke fürs In-die-richtige-Richtung-Schieben.
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; 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! |
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:36 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz