THRIFT-4454 Large writes/reads may cause range check errors in debug mode
Client: Delphi
Patch: Jens Geyer
This closes #1490
diff --git a/lib/delphi/src/Thrift.Stream.pas b/lib/delphi/src/Thrift.Stream.pas
index b6e0cbf..3308c53 100644
--- a/lib/delphi/src/Thrift.Stream.pas
+++ b/lib/delphi/src/Thrift.Stream.pas
@@ -132,6 +132,7 @@
end;
function TThriftStreamAdapterCOM.Read( const pBuf : Pointer; const buflen : Integer; offset: Integer; count: Integer): Integer;
+var pTmp : PByte;
begin
inherited;
@@ -141,7 +142,9 @@
Result := 0;
if FStream <> nil then begin
if count > 0 then begin
- FStream.Read( @(PByteArray(pBuf)^[offset]), count, @Result);
+ pTmp := pBuf;
+ Inc( pTmp, offset);
+ FStream.Read( pTmp, count, @Result);
end;
end;
end;
@@ -172,11 +175,14 @@
procedure TThriftStreamAdapterCOM.Write( const pBuf: Pointer; offset: Integer; count: Integer);
var nWritten : Integer;
+ pTmp : PByte;
begin
inherited;
if IsOpen then begin
if count > 0 then begin
- FStream.Write( @(PByteArray(pBuf)^[offset]), count, @nWritten);
+ pTmp := pBuf;
+ Inc( pTmp, offset);
+ FStream.Write( pTmp, count, @nWritten);
end;
end;
end;
@@ -259,14 +265,18 @@
end;
function TThriftStreamAdapterDelphi.Read(const pBuf : Pointer; const buflen : Integer; offset, count: Integer): Integer;
+var pTmp : PByte;
begin
inherited;
if count >= buflen-offset
then count := buflen-offset;
- if count > 0
- then Result := FStream.Read( PByteArray(pBuf)^[offset], count)
+ if count > 0 then begin
+ pTmp := pBuf;
+ Inc( pTmp, offset);
+ Result := FStream.Read( pTmp^, count)
+ end
else Result := 0;
end;
@@ -296,10 +306,13 @@
end;
procedure TThriftStreamAdapterDelphi.Write(const pBuf : Pointer; offset, count: Integer);
+var pTmp : PByte;
begin
inherited;
if count > 0 then begin
- FStream.Write( PByteArray(pBuf)^[offset], count)
+ pTmp := pBuf;
+ Inc( pTmp, offset);
+ FStream.Write( pTmp^, count)
end;
end;