diff options
author | Vedant Kumar <vsk@apple.com> | 2017-10-23 18:04:34 +0000 |
---|---|---|
committer | Vedant Kumar <vsk@apple.com> | 2017-10-23 18:04:34 +0000 |
commit | 35b50a83aba3a5eedd3395341b5be76600a6841c (patch) | |
tree | f70f4bba61b5f853cf7edcf6653510af4d8505b7 /llvm/lib/Object/WasmObjectFile.cpp | |
parent | 1108d072f47b74ff671df61b434a18da02f4dd3e (diff) | |
download | llvm-35b50a83aba3a5eedd3395341b5be76600a6841c.zip llvm-35b50a83aba3a5eedd3395341b5be76600a6841c.tar.gz llvm-35b50a83aba3a5eedd3395341b5be76600a6841c.tar.bz2 |
[wasm] readSection: Avoid reading past eof (fixes oss-fuzz #3219)
A wasm file crafted with a bogus section size can trigger an ASan issue
in the DWARFObjInMemory constructor. Nip the problem in the bud when we
read the wasm section.
Found by OSS-Fuzz:
https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=3219
Differential Revision: https://reviews.llvm.org/D38777
llvm-svn: 316357
Diffstat (limited to 'llvm/lib/Object/WasmObjectFile.cpp')
-rw-r--r-- | llvm/lib/Object/WasmObjectFile.cpp | 8 |
1 files changed, 5 insertions, 3 deletions
diff --git a/llvm/lib/Object/WasmObjectFile.cpp b/llvm/lib/Object/WasmObjectFile.cpp index 15a78df..86ce9c2 100644 --- a/llvm/lib/Object/WasmObjectFile.cpp +++ b/llvm/lib/Object/WasmObjectFile.cpp @@ -178,14 +178,16 @@ static wasm::WasmTable readTable(const uint8_t *&Ptr) { } static Error readSection(WasmSection &Section, const uint8_t *&Ptr, - const uint8_t *Start) { - // TODO(sbc): Avoid reading past EOF in the case of malformed files. + const uint8_t *Start, const uint8_t *Eof) { Section.Offset = Ptr - Start; Section.Type = readVaruint7(Ptr); uint32_t Size = readVaruint32(Ptr); if (Size == 0) return make_error<StringError>("Zero length section", object_error::parse_failed); + if (Ptr + Size > Eof) + return make_error<StringError>("Section too large", + object_error::parse_failed); Section.Content = ArrayRef<uint8_t>(Ptr, Size); Ptr += Size; return Error::success(); @@ -221,7 +223,7 @@ WasmObjectFile::WasmObjectFile(MemoryBufferRef Buffer, Error &Err) WasmSection Sec; while (Ptr < Eof) { - if ((Err = readSection(Sec, Ptr, getPtr(0)))) + if ((Err = readSection(Sec, Ptr, getPtr(0), Eof))) return; if ((Err = parseSection(Sec))) return; |