Ваш код в порядке.Используемый вами код TStringBuilder неисправен.Рассмотрим этот метод:
procedure TStringBuilder.Append(const AString : string);
var iLen : integer;
begin
iLen := length(AString);
if iLen + FIndex > FBuffMax then _ExpandBuffer;
move(AString[1],FBuffer[FIndex],iLen);
inc(FIndex,iLen);
end;
Если будущая длина слишком велика для текущего размера буфера, буфер расширяется._ExpandBuffer
удваивает размер буфера, но после этого он никогда не проверяет, достаточен ли новый размер буфера.Если исходный размер буфера равен 1024, а загружаемый файл равен 3 КБ, то удвоение размера буфера до 2048 по-прежнему приведет к тому, что буфер будет слишком мал в Append
, и в результате вы перезапишете 1024 байта за пределы конца.буфера.
Измените if
на while
в Append
.