Browse Source

Check that sizeof(tppuheader) was indeed read in ReadHeader method

Pierre Muller 3 months ago
parent
commit
5e7bc906e5
1 changed files with 17 additions and 7 deletions
  1. 17 7
      compiler/ppu.pas

+ 17 - 7
compiler/ppu.pas

@@ -174,10 +174,8 @@ type
 implementation
 implementation
 
 
   uses
   uses
-{$ifdef Test_Double_checksum}
     comphook,
     comphook,
     globals,
     globals,
-{$endif def Test_Double_checksum}
     fpchash;
     fpchash;
 
 
 {$ifdef Test_Double_checksum}
 {$ifdef Test_Double_checksum}
@@ -278,10 +276,22 @@ end;
 
 
 
 
 function tppufile.readheader: longint;
 function tppufile.readheader: longint;
+var
+  is_valid : boolean;
 begin
 begin
-  if fsize<sizeof(tppuheader) then
-    exit(-1);
+  is_valid:=true;
+  result:=fsize;
+  if result<sizeof(tppuheader) then
+    is_valid:=false;
   result:=f.Read(header,sizeof(tppuheader));
   result:=f.Read(header,sizeof(tppuheader));
+  if (result<>sizeof(tppuheader)) then
+    is_valid:=false;
+  if not is_valid then
+    begin
+      fillchar(header,sizeof(tppuheader),#0);
+      do_comment(V_Error,' Invalid header size '+tostr(result)+' (expecting '+tostr(sizeof(tppuheader))+')');
+      exit(-1);
+    end;
   { The header is always stored in little endian order }
   { The header is always stored in little endian order }
   { therefore swap if on a big endian machine          }
   { therefore swap if on a big endian machine          }
 {$IFDEF ENDIAN_BIG}
 {$IFDEF ENDIAN_BIG}
@@ -426,7 +436,7 @@ begin
                do_internalerror(2020113001);
                do_internalerror(2020113001);
              {$ENDIF}
              {$ENDIF}
 {$ifdef Test_Double_checksum_write}
 {$ifdef Test_Double_checksum_write}
-             Writeln(CRCFile,'!!!imp_crc ',implementation_read_crc_index:5,'$',hexstr(crc,8),'<>$',hexstr(implementation_crc_array^[implementation_read_crc_index],8));
+             Writeln(CRCFile,'!!!imp_crc ',implementation_read_crc_index:5,' $',hexstr(crc,8),'<>$',hexstr(implementation_crc_array^[implementation_read_crc_index],8));
            end
            end
          else
          else
            begin
            begin
@@ -464,7 +474,7 @@ begin
                   do_internalerror(2020113002);
                   do_internalerror(2020113002);
                 {$ENDIF}
                 {$ENDIF}
 {$ifdef Test_Double_checksum_write}
 {$ifdef Test_Double_checksum_write}
-                Writeln(CRCFile,'!!!int_crc ',interface_read_crc_index:5,'$',hexstr(interface_crc,8),'<>$',hexstr(interface_crc_array^[interface_read_crc_index],8));
+                Writeln(CRCFile,'!!!int_crc ',interface_read_crc_index:5,' $',hexstr(interface_crc,8),'<>$',hexstr(interface_crc_array^[interface_read_crc_index],8));
               end
               end
             else
             else
               begin
               begin
@@ -505,7 +515,7 @@ begin
                        do_internalerror(2020113003);
                        do_internalerror(2020113003);
                      {$ENDIF}
                      {$ENDIF}
 {$ifdef Test_Double_checksum_write}
 {$ifdef Test_Double_checksum_write}
-                     Writeln(CRCFile,'!!!ind_crc ',indirect_read_crc_index:5,'$',hexstr(indirect_crc,8),'<>$',hexstr(indirect_crc_array^[indirect_read_crc_index],8));
+                     Writeln(CRCFile,'!!!ind_crc ',indirect_read_crc_index:5,' $',hexstr(indirect_crc,8),'<>$',hexstr(indirect_crc_array^[indirect_read_crc_index],8));
                    end
                    end
                  else
                  else
                    begin
                    begin