* fixed arithmetic overflow when loading the recorddef of large

(> high(aint)/8 bytes) records from ppu files

git-svn-id: trunk@5595 -
This commit is contained in:
Jonas Maebe 2006-12-14 20:24:20 +00:00
parent 22a372f10b
commit 26f81bfe08
4 changed files with 10 additions and 6 deletions

View File

@ -43,7 +43,7 @@ type
{$endif Test_Double_checksum} {$endif Test_Double_checksum}
const const
CurrentPPUVersion=69; CurrentPPUVersion=70;
{ buffer sizes } { buffer sizes }
maxentrysize = 1024; maxentrysize = 1024;

View File

@ -2426,11 +2426,12 @@ implementation
begin begin
inherited ppuload(recorddef,ppufile); inherited ppuload(recorddef,ppufile);
symtable:=trecordsymtable.create(0); symtable:=trecordsymtable.create(0);
trecordsymtable(symtable).datasize:=ppufile.getaint;
trecordsymtable(symtable).fieldalignment:=shortint(ppufile.getbyte); trecordsymtable(symtable).fieldalignment:=shortint(ppufile.getbyte);
trecordsymtable(symtable).recordalignment:=shortint(ppufile.getbyte); trecordsymtable(symtable).recordalignment:=shortint(ppufile.getbyte);
trecordsymtable(symtable).padalignment:=shortint(ppufile.getbyte); trecordsymtable(symtable).padalignment:=shortint(ppufile.getbyte);
trecordsymtable(symtable).usefieldalignment:=shortint(ppufile.getbyte); trecordsymtable(symtable).usefieldalignment:=shortint(ppufile.getbyte);
{ requires usefieldalignment to be set }
trecordsymtable(symtable).datasize:=ppufile.getaint;
trecordsymtable(symtable).ppuload(ppufile); trecordsymtable(symtable).ppuload(ppufile);
symtable.defowner:=self; symtable.defowner:=self;
isunion:=false; isunion:=false;
@ -2486,11 +2487,11 @@ implementation
procedure trecorddef.ppuwrite(ppufile:tcompilerppufile); procedure trecorddef.ppuwrite(ppufile:tcompilerppufile);
begin begin
inherited ppuwrite(ppufile); inherited ppuwrite(ppufile);
ppufile.putaint(trecordsymtable(symtable).datasize);
ppufile.putbyte(byte(trecordsymtable(symtable).fieldalignment)); ppufile.putbyte(byte(trecordsymtable(symtable).fieldalignment));
ppufile.putbyte(byte(trecordsymtable(symtable).recordalignment)); ppufile.putbyte(byte(trecordsymtable(symtable).recordalignment));
ppufile.putbyte(byte(trecordsymtable(symtable).padalignment)); ppufile.putbyte(byte(trecordsymtable(symtable).padalignment));
ppufile.putbyte(byte(trecordsymtable(symtable).usefieldalignment)); ppufile.putbyte(byte(trecordsymtable(symtable).usefieldalignment));
ppufile.putaint(trecordsymtable(symtable).datasize);
ppufile.writeentry(ibrecorddef); ppufile.writeentry(ibrecorddef);
trecordsymtable(symtable).ppuwrite(ppufile); trecordsymtable(symtable).ppuwrite(ppufile);
end; end;

View File

@ -913,7 +913,9 @@ implementation
procedure tabstractrecordsymtable.setdatasize(val: aint); procedure tabstractrecordsymtable.setdatasize(val: aint);
begin begin
_datasize:=val; _datasize:=val;
databitsize:=val*8; if (usefieldalignment=bit_alignment) then
{ can overflow in non bitpacked records }
databitsize:=val*8;
end; end;
{**************************************************************************** {****************************************************************************
@ -943,7 +945,8 @@ implementation
storesize:=_datasize; storesize:=_datasize;
storealign:=fieldalignment; storealign:=fieldalignment;
_datasize:=offset; _datasize:=offset;
databitsize:=offset*8; if (usefieldalignment=bit_alignment) then
databitsize:=offset*8;
{ We move the ownership of the defs and symbols to the new recordsymtable. { We move the ownership of the defs and symbols to the new recordsymtable.
The old unionsymtable keeps the references, but doesn't own the The old unionsymtable keeps the references, but doesn't own the

View File

@ -1831,11 +1831,11 @@ begin
ibrecorddef : ibrecorddef :
begin begin
readcommondef('Record definition'); readcommondef('Record definition');
writeln(space,' DataSize : ',getaint);
writeln(space,' FieldAlign : ',getbyte); writeln(space,' FieldAlign : ',getbyte);
writeln(space,' RecordAlign : ',getbyte); writeln(space,' RecordAlign : ',getbyte);
writeln(space,' PadAlign : ',getbyte); writeln(space,' PadAlign : ',getbyte);
writeln(space,'UseFieldAlignment : ',getbyte); writeln(space,'UseFieldAlignment : ',getbyte);
writeln(space,' DataSize : ',getaint);
if not EndOfEntry then if not EndOfEntry then
Writeln('!! Entry has more information stored'); Writeln('!! Entry has more information stored');
{read the record definitions and symbols} {read the record definitions and symbols}