Index: include/llvm/Object/Wasm.h =================================================================== --- include/llvm/Object/Wasm.h +++ include/llvm/Object/Wasm.h @@ -221,6 +221,8 @@ uint32_t StartFunction = -1; bool HasLinkingSection = false; wasm::WasmLinkingData LinkingData; + uint32_t NumImportedGlobals = 0; + uint32_t NumImportedFunctions = 0; StringMap SymbolMap; }; Index: lib/Object/WasmObjectFile.cpp =================================================================== --- lib/Object/WasmObjectFile.cpp +++ lib/Object/WasmObjectFile.cpp @@ -472,6 +472,7 @@ Im.Kind = readUint8(Ptr); switch (Im.Kind) { case wasm::WASM_EXTERNAL_FUNCTION: + NumImportedFunctions++; Im.SigIndex = readVaruint32(Ptr); SymbolMap.try_emplace(Im.Field, Symbols.size()); Symbols.emplace_back(Im.Field, WasmSymbol::SymbolType::FUNCTION_IMPORT, @@ -480,6 +481,7 @@ << " sym index:" << Symbols.size() << "\n"); break; case wasm::WASM_EXTERNAL_GLOBAL: + NumImportedGlobals++; Im.Global.Type = readVarint7(Ptr); Im.Global.Mutable = readVaruint1(Ptr); SymbolMap.try_emplace(Im.Field, Symbols.size()); @@ -580,10 +582,16 @@ switch (Ex.Kind) { case wasm::WASM_EXTERNAL_FUNCTION: ExportType = WasmSymbol::SymbolType::FUNCTION_EXPORT; + if (Ex.Index >= FunctionTypes.size() + NumImportedFunctions) + return make_error("Invalid function export", + object_error::parse_failed); MakeSymbol = true; break; case wasm::WASM_EXTERNAL_GLOBAL: ExportType = WasmSymbol::SymbolType::GLOBAL_EXPORT; + if (Ex.Index >= Globals.size() + NumImportedGlobals) + return make_error("Invalid global export", + object_error::parse_failed); MakeSymbol = true; break; case wasm::WASM_EXTERNAL_MEMORY: Index: test/ObjectYAML/wasm/export_section.yaml =================================================================== --- test/ObjectYAML/wasm/export_section.yaml +++ test/ObjectYAML/wasm/export_section.yaml @@ -3,6 +3,20 @@ FileHeader: Version: 0x00000001 Sections: + - Type: FUNCTION + FunctionTypes: [ 0, 0 ] + - Type: GLOBAL + Globals: + - Type: I32 + Mutable: false + InitExpr: + Opcode: I64_CONST + Value: 32 + - Type: I32 + Mutable: false + InitExpr: + Opcode: I64_CONST + Value: 64 - Type: EXPORT Exports: - Name: function_export Index: test/ObjectYAML/wasm/invalid_export.yaml =================================================================== --- /dev/null +++ test/ObjectYAML/wasm/invalid_export.yaml @@ -0,0 +1,13 @@ +# RUN: yaml2obj < %s | not obj2yaml 2>&1 | FileCheck %s + +--- !WASM +FileHeader: + Version: 0x00000001 +Sections: + - Type: EXPORT + Exports: + - Name: invalid_function_index + Kind: FUNCTION + Index: 0x00000001 + +# CHECK: Error reading file: : Invalid function export Index: test/tools/llvm-nm/wasm/exports.yaml =================================================================== --- test/tools/llvm-nm/wasm/exports.yaml +++ test/tools/llvm-nm/wasm/exports.yaml @@ -12,6 +12,25 @@ - ReturnType: I32 ParamTypes: - I32 + - Type: FUNCTION + FunctionTypes: [ 0, 0, 0, 0, 0 ] + - Type: GLOBAL + Globals: + - Type: I32 + Mutable: false + InitExpr: + Opcode: I64_CONST + Value: 32 + - Type: I32 + Mutable: false + InitExpr: + Opcode: I64_CONST + Value: 64 + - Type: I32 + Mutable: false + InitExpr: + Opcode: I64_CONST + Value: 1024 - Type: EXPORT Exports: - Name: foo Index: test/tools/llvm-nm/wasm/weak-symbols.yaml =================================================================== --- test/tools/llvm-nm/wasm/weak-symbols.yaml +++ test/tools/llvm-nm/wasm/weak-symbols.yaml @@ -12,6 +12,8 @@ - ReturnType: I32 ParamTypes: - I32 + - Type: FUNCTION + FunctionTypes: [ 0, 0, 0, 0 ] - Type: IMPORT Imports: - Module: env @@ -23,6 +25,23 @@ Kind: GLOBAL GlobalType: I32 GlobalMutable: false + - Type: GLOBAL + Globals: + - Type: I32 + Mutable: false + InitExpr: + Opcode: I64_CONST + Value: 32 + - Type: I32 + Mutable: false + InitExpr: + Opcode: I64_CONST + Value: 64 + - Type: I32 + Mutable: false + InitExpr: + Opcode: I64_CONST + Value: 1024 - Type: EXPORT Exports: - Name: weak_global_func