Browse Source

Avoid some range check error and convert internalerror into error messages

Pierre Muller 3 years ago
parent
commit
7c21b37105
1 changed files with 55 additions and 12 deletions
  1. 55 12
      compiler/ogwasm.pas

+ 55 - 12
compiler/ogwasm.pas

@@ -259,9 +259,25 @@ implementation
           result:=result or (uint64(b and 127) shl shift);
           result:=result or (uint64(b and 127) shl shift);
           inc(shift,7);
           inc(shift,7);
         until (b and 128)=0;
         until (b and 128)=0;
+{$ifopt Q+}
+{$define overflowon}
+{$Q-}
+{$endif}
+{$ifopt R+}
+{$define rangeon}
+{$R-}
+{$endif}
         if (b and 64)<>0 then
         if (b and 64)<>0 then
           result:=result or (high(uint64) shl shift);
           result:=result or (high(uint64) shl shift);
       end;
       end;
+{$ifdef overflowon}
+{$Q+}
+{$undef overflowon}
+{$endif}
+{$ifdef rangeon}
+{$R+}
+{$undef rangeon}
+{$endif}
 
 
     procedure AddSleb5(d: tdynamicarray; v: int64);
     procedure AddSleb5(d: tdynamicarray; v: int64);
       var
       var
@@ -1026,7 +1042,7 @@ implementation
                         internalerror(2021092509);
                         internalerror(2021092509);
                       objsec.Data.seek(objrel.DataOffset);
                       objsec.Data.seek(objrel.DataOffset);
                       if TWasmObjSymbol(objrel.symbol).FuncIndex<0 then
                       if TWasmObjSymbol(objrel.symbol).FuncIndex<0 then
-                        internalerror(2022012401)
+                        message1(asmw_e_illegal_unset_index,objrel.symbol.name)
                       else
                       else
                         WriteUleb5(objsec.Data,TWasmObjSymbol(objrel.symbol).FuncIndex);
                         WriteUleb5(objsec.Data,TWasmObjSymbol(objrel.symbol).FuncIndex);
                     end;
                     end;
@@ -1068,7 +1084,7 @@ implementation
                         internalerror(2021092509);
                         internalerror(2021092509);
                       objsec.Data.seek(objrel.DataOffset);
                       objsec.Data.seek(objrel.DataOffset);
                       if TWasmObjSymbol(objrel.symbol).GlobalIndex<0 then
                       if TWasmObjSymbol(objrel.symbol).GlobalIndex<0 then
-                        internalerror(2022012402)
+                        message1(asmw_e_illegal_unset_index,objrel.symbol.name)
                       else
                       else
                         WriteUleb5(objsec.Data,TWasmObjSymbol(objrel.symbol).GlobalIndex);
                         WriteUleb5(objsec.Data,TWasmObjSymbol(objrel.symbol).GlobalIndex);
                     end;
                     end;
@@ -1078,7 +1094,7 @@ implementation
                         internalerror(2021092716);
                         internalerror(2021092716);
                       objsec.Data.seek(objrel.DataOffset);
                       objsec.Data.seek(objrel.DataOffset);
                       if TWasmObjSymbol(objrel.symbol).TagIndex<0 then
                       if TWasmObjSymbol(objrel.symbol).TagIndex<0 then
-                        internalerror(2022012403)
+                        message1(asmw_e_illegal_unset_index,objrel.symbol.name)
                       else
                       else
                         WriteSleb5(objsec.Data,TWasmObjSymbol(objrel.symbol).TagIndex);
                         WriteSleb5(objsec.Data,TWasmObjSymbol(objrel.symbol).TagIndex);
                     end;
                     end;
@@ -1170,7 +1186,10 @@ implementation
                           Inc(relcount^);
                           Inc(relcount^);
                           WriteByte(relout,Ord(R_WASM_MEMORY_ADDR_I32));
                           WriteByte(relout,Ord(R_WASM_MEMORY_ADDR_I32));
                           WriteUleb(relout,objrel.DataOffset+objsec.FileSectionOfs);
                           WriteUleb(relout,objrel.DataOffset+objsec.FileSectionOfs);
-                          WriteUleb(relout,TWasmObjSymbol(objrel.symbol).SymbolIndex);
+			  if (TWasmObjSymbol(objrel.symbol).SymbolIndex<0) then
+                            message1(asmw_e_illegal_unset_index,objrel.symbol.name)
+                          else
+                            WriteUleb(relout,TWasmObjSymbol(objrel.symbol).SymbolIndex);
                           WriteSleb(relout,objrel.Addend);  { addend to add to the address }
                           WriteSleb(relout,objrel.Addend);  { addend to add to the address }
                         end;
                         end;
                     end;
                     end;
@@ -1188,7 +1207,10 @@ implementation
                       Inc(relcount^);
                       Inc(relcount^);
                       WriteByte(relout,Ord(R_WASM_GLOBAL_INDEX_LEB));
                       WriteByte(relout,Ord(R_WASM_GLOBAL_INDEX_LEB));
                       WriteUleb(relout,objrel.DataOffset+objsec.FileSectionOfs);
                       WriteUleb(relout,objrel.DataOffset+objsec.FileSectionOfs);
-                      WriteUleb(relout,TWasmObjSymbol(objrel.symbol).SymbolIndex);
+                      if (TWasmObjSymbol(objrel.symbol).SymbolIndex<0) then
+                        message1(asmw_e_illegal_unset_index,objrel.symbol.name)
+                      else
+                        WriteUleb(relout,TWasmObjSymbol(objrel.symbol).SymbolIndex);
                     end;
                     end;
                   RELOC_TAG_INDEX_LEB:
                   RELOC_TAG_INDEX_LEB:
                     begin
                     begin
@@ -1197,7 +1219,10 @@ implementation
                       Inc(relcount^);
                       Inc(relcount^);
                       WriteByte(relout,Ord(R_WASM_TAG_INDEX_LEB));
                       WriteByte(relout,Ord(R_WASM_TAG_INDEX_LEB));
                       WriteUleb(relout,objrel.DataOffset+objsec.FileSectionOfs);
                       WriteUleb(relout,objrel.DataOffset+objsec.FileSectionOfs);
-                      WriteUleb(relout,TWasmObjSymbol(objrel.symbol).SymbolIndex);
+                      if (TWasmObjSymbol(objrel.symbol).SymbolIndex<0) then
+                        message1(asmw_e_illegal_unset_index,objrel.symbol.name)
+                      else
+                        WriteUleb(relout,TWasmObjSymbol(objrel.symbol).SymbolIndex);
                     end;
                     end;
                   else
                   else
                     internalerror(2021092507);
                     internalerror(2021092507);
@@ -1487,7 +1512,10 @@ implementation
                   begin
                   begin
                     WriteName(FWasmSections[wsiExport],TWasmObjSymbolExtraData(FData.FObjSymbolsExtraDataList.Find(objsym.Name)).ExportName);
                     WriteName(FWasmSections[wsiExport],TWasmObjSymbolExtraData(FData.FObjSymbolsExtraDataList.Find(objsym.Name)).ExportName);
                     WriteByte(FWasmSections[wsiExport],0);  { func }
                     WriteByte(FWasmSections[wsiExport],0);  { func }
-                    WriteUleb(FWasmSections[wsiExport],objsym.FuncIndex);
+                    if (objsym.FuncIndex<0) then
+                      message1(asmw_e_illegal_unset_index,objsym.name)
+                    else
+                      WriteUleb(FWasmSections[wsiExport],objsym.FuncIndex);
                   end;
                   end;
               end;
               end;
           end;
           end;
@@ -1510,7 +1538,10 @@ implementation
                   WriteUleb(FWasmSymbolTable,WASM_SYM_BINDING_WEAK)
                   WriteUleb(FWasmSymbolTable,WASM_SYM_BINDING_WEAK)
                 else
                 else
                   internalerror(2021092715);
                   internalerror(2021092715);
-                WriteUleb(FWasmSymbolTable,objsym.TagIndex);
+                if (objsym.TagIndex<0) then
+                  message1(asmw_e_illegal_unset_index,objsym.name)
+                else
+                  WriteUleb(FWasmSymbolTable,objsym.TagIndex);
                 if objsym.bind<>AB_EXTERNAL then
                 if objsym.bind<>AB_EXTERNAL then
                   WriteName(FWasmSymbolTable,objsym.Name);
                   WriteName(FWasmSymbolTable,objsym.Name);
               end
               end
@@ -1522,7 +1553,10 @@ implementation
                 if objsym.bind=AB_EXTERNAL then
                 if objsym.bind=AB_EXTERNAL then
                   begin
                   begin
                     WriteUleb(FWasmSymbolTable,WASM_SYM_UNDEFINED);
                     WriteUleb(FWasmSymbolTable,WASM_SYM_UNDEFINED);
-                    WriteUleb(FWasmSymbolTable,objsym.GlobalIndex);
+                    if (objsym.GlobalIndex<0) then
+                      message1(asmw_e_illegal_unset_index,objsym.name)
+                    else
+                      WriteUleb(FWasmSymbolTable,objsym.GlobalIndex);
                   end
                   end
                 else
                 else
                   {not implemented yet}
                   {not implemented yet}
@@ -1536,13 +1570,19 @@ implementation
                 if objsym.ExtraData.ImportModule<>'' then
                 if objsym.ExtraData.ImportModule<>'' then
                   begin
                   begin
                     WriteUleb(FWasmSymbolTable,WASM_SYM_UNDEFINED or WASM_SYM_EXPLICIT_NAME);
                     WriteUleb(FWasmSymbolTable,WASM_SYM_UNDEFINED or WASM_SYM_EXPLICIT_NAME);
-                    WriteUleb(FWasmSymbolTable,objsym.FuncIndex);
+                    if (objsym.FuncIndex<0) then
+                      message1(asmw_e_illegal_unset_index,objsym.name)
+                    else
+                      WriteUleb(FWasmSymbolTable,objsym.FuncIndex);
                     WriteName(FWasmSymbolTable,objsym.Name);
                     WriteName(FWasmSymbolTable,objsym.Name);
                   end
                   end
                 else
                 else
                   begin
                   begin
                     WriteUleb(FWasmSymbolTable,WASM_SYM_UNDEFINED);
                     WriteUleb(FWasmSymbolTable,WASM_SYM_UNDEFINED);
-                    WriteUleb(FWasmSymbolTable,objsym.FuncIndex);
+                    if (objsym.FuncIndex<0) then
+                      message1(asmw_e_illegal_unset_index,objsym.name)
+                    else
+                      WriteUleb(FWasmSymbolTable,objsym.FuncIndex);
                   end;
                   end;
               end
               end
             else if objsym.typ=AT_FUNCTION then
             else if objsym.typ=AT_FUNCTION then
@@ -1563,7 +1603,10 @@ implementation
                       WriteUleb(FWasmSymbolTable,WASM_SYM_EXPORTED)
                       WriteUleb(FWasmSymbolTable,WASM_SYM_EXPORTED)
                     else
                     else
                       WriteUleb(FWasmSymbolTable,0);
                       WriteUleb(FWasmSymbolTable,0);
-                    WriteUleb(FWasmSymbolTable,objsym.FuncIndex);
+                    if (objsym.FuncIndex<0) then
+                      message1(asmw_e_illegal_unset_index,objsym.name)
+                    else
+                      WriteUleb(FWasmSymbolTable,objsym.FuncIndex);
                   end;
                   end;
                 WriteName(FWasmSymbolTable,objsym.Name);
                 WriteName(FWasmSymbolTable,objsym.Name);
               end
               end