diff options
author | Sam Clegg <sbc@chromium.org> | 2018-01-12 02:11:31 +0000 |
---|---|---|
committer | Sam Clegg <sbc@chromium.org> | 2018-01-12 02:11:31 +0000 |
commit | 4710ed7a8ce3224c0d1fbb43748752513b0b6912 (patch) | |
tree | 70ae8555b7736709021f262a6d9f0fc46bf662b5 /llvm/lib/Object | |
parent | 1b31eb94148465eecf4bb50b16d8f26ac2dcc701 (diff) | |
download | bcm5719-llvm-4710ed7a8ce3224c0d1fbb43748752513b0b6912.tar.gz bcm5719-llvm-4710ed7a8ce3224c0d1fbb43748752513b0b6912.zip |
[WebAssembly] Don't allow functions to be named twice
The spec doesn't allow this.
Differential Revision: https://reviews.llvm.org/D41974
llvm-svn: 322343
Diffstat (limited to 'llvm/lib/Object')
-rw-r--r-- | llvm/lib/Object/WasmObjectFile.cpp | 7 |
1 files changed, 6 insertions, 1 deletions
diff --git a/llvm/lib/Object/WasmObjectFile.cpp b/llvm/lib/Object/WasmObjectFile.cpp index ec2e2bfbb4d..60c87caca0a 100644 --- a/llvm/lib/Object/WasmObjectFile.cpp +++ b/llvm/lib/Object/WasmObjectFile.cpp @@ -8,6 +8,7 @@ //===----------------------------------------------------------------------===// #include "llvm/ADT/ArrayRef.h" +#include "llvm/ADT/DenseSet.h" #include "llvm/ADT/STLExtras.h" #include "llvm/ADT/StringRef.h" #include "llvm/ADT/StringSet.h" @@ -268,6 +269,8 @@ Error WasmObjectFile::parseSection(WasmSection &Sec) { } Error WasmObjectFile::parseNameSection(const uint8_t *Ptr, const uint8_t *End) { + llvm::DenseSet<uint64_t> Seen; + while (Ptr < End) { uint8_t Type = readVarint7(Ptr); uint32_t Size = readVaruint32(Ptr); @@ -277,6 +280,9 @@ Error WasmObjectFile::parseNameSection(const uint8_t *Ptr, const uint8_t *End) { uint32_t Count = readVaruint32(Ptr); while (Count--) { uint32_t Index = readVaruint32(Ptr); + if (!Seen.insert(Index).second) + return make_error<GenericBinaryError>("Function named more than once", + object_error::parse_failed); StringRef Name = readString(Ptr); if (!Name.empty()) Symbols.emplace_back(Name, @@ -375,7 +381,6 @@ Error WasmObjectFile::parseLinkingSection(const uint8_t *Ptr, uint32_t Count = readVaruint32(Ptr); while (Count--) { StringRef Symbol = readString(Ptr); - DEBUG(dbgs() << "reading syminfo: " << Symbol << "\n"); uint32_t Flags = readVaruint32(Ptr); auto iter = SymbolMap.find(Symbol); if (iter == SymbolMap.end()) { |