X-Git-Url: https://deadsoftware.ru/gitweb?a=blobdiff_plain;f=src%2Fengine%2Fe_msg.pas;h=7e976e87d38b00fecd761ba2b1175b39a32833f0;hb=0cf129a368fac6c1f7e261806a44f9d5b2ade100;hp=a2ecc52e3e9a40e6a2c58dede4d26344e35847b3;hpb=69ed21bb4a9cd4c59ba1acfd5971c7be5f854ee2;p=d2df-sdl.git diff --git a/src/engine/e_msg.pas b/src/engine/e_msg.pas index a2ecc52..7e976e8 100644 --- a/src/engine/e_msg.pas +++ b/src/engine/e_msg.pas @@ -28,6 +28,7 @@ type CurSize: Integer; ReadCount: Integer; Bit: Integer; + AllocStep: Integer; OwnMemory: Boolean; function Init(V: Pointer; N: Integer; Full: Boolean = False): Boolean; @@ -94,6 +95,7 @@ begin if P = nil then raise Exception.Create('TMsg.Alloc: no mem'); Init(P, N); + AllocStep := N; OwnMemory := True; end; @@ -141,27 +143,32 @@ begin end; procedure TMsg.WriteData(V: Pointer; N: Integer); +var + NewSize: Integer; begin if CurSize + N > MaxSize then begin - Overflow := True; - raise Exception.Create('TMsg.WriteData: buffer overrun!'); - Exit; + if OwnMemory then + begin + NewSize := MaxSize + ((N + AllocStep - 1) div AllocStep) * AllocStep; // round up + if ReAllocMem(Data, NewSize) = nil then + raise Exception.Create('TMsg.WriteData: out of memory on realloc'); + MaxSize := NewSize; + end + else + begin + Overflow := True; + raise Exception.Create('TMsg.WriteData: buffer overrun on borrowed memory!'); + end; end; + Move(V^, (Data + CurSize)^, N); CurSize := CurSize + N; end; procedure TMsg.Write(V: TMsg); begin - if CurSize + V.CurSize > MaxSize then - begin - Overflow := True; - raise Exception.Create('TMsg.WriteData: buffer overrun!'); - Exit; - end; - Move(V.Data^, (Data + CurSize)^, V.CurSize); - CurSize := CurSize + V.CurSize; + WriteData(V.Data, V.CurSize); end; procedure TMsg.Write(V: Byte); overload;