mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-08-22 17:33:32 +02:00
* 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:
parent
22a372f10b
commit
26f81bfe08
@ -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;
|
||||||
|
@ -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;
|
||||||
|
@ -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
|
||||||
|
@ -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}
|
||||||
|
Loading…
Reference in New Issue
Block a user