Hallo,
ein Nutzer der
DEC hat einen Crash gemeldet. Ich kann den mit dessen
Beispielprogramm nachstellen, ich verstehe aber noch nicht warum das passiert.
Es gibt diese Typdeklarationen:
Delphi-Quellcode:
/// <summary>
/// Replacement for PByteArray
/// </summary>
PUInt8Array = ^TInt8Array;
TInt8Array = array[0..MaxInt-1] of Byte;
Der Crash passiert hier drin:
Delphi-Quellcode:
procedure TDECCipherModes.EncodeGCM(Source, Dest: PUInt8Array; Size: Integer);
var
PlainText,
CipherText : TBytes;
begin
if (Size > 0) then
begin
PlainText := TBytes(@Source^);
SetLength(PlainText, Size);
Crash> CipherText := TBytes(@Dest^);
SetLength(CipherText, Size);
end
else
begin
SetLength(PlainText, 0);
SetLength(CipherText, 0);
end;
FGCM.EncodeGCM(PlainText, CipherText, Size);
end;
Es gibt da eine Zugriffsverletzung.
Das SetLength(PlainText, Size) und SetLength(CipherText, Size) habe ich schon ergänzt.
EncodeGCM wird von dieser Methode aus aufgerufen:
Delphi-Quellcode:
procedure TDECCipherModes.Encode(const Source; var Dest; DataSize: Integer);
begin
EncodeGCM(@Source, @Dest, DataSize);
end;
Debugge ich doert hin liefert Assigned(@Dest) unter Watches true
Das Testprogramm übergibt diese Variablen an Encode:
ciphText, refCipherText : Array[0..3] of LongWord;
1. Warum crasht der Typecast CipherText := TBytes(@Dest^);
2. Kann man das EncodeGCM evtl. irgendwie besser schreiben?