summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Object/WasmObjectFile.cpp
diff options
context:
space:
mode:
authorSam Clegg <sbc@chromium.org>2018-05-18 21:08:26 +0000
committerSam Clegg <sbc@chromium.org>2018-05-18 21:08:26 +0000
commit4bbc6b55e7bc13b04eb7e47f6cc6df17e508a270 (patch)
treee5958958ce237869ef7b58f432fd448ce8c82079 /llvm/lib/Object/WasmObjectFile.cpp
parent0ca8c0895c6034615593c295dd955f29b25bf3d4 (diff)
downloadbcm5719-llvm-4bbc6b55e7bc13b04eb7e47f6cc6df17e508a270.tar.gz
bcm5719-llvm-4bbc6b55e7bc13b04eb7e47f6cc6df17e508a270.zip
[WebAssembly] Object: Add more error checking for object file reading
This should address some the assert failures the fuzzer has been finding such as: https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=6719 Differential Revision: https://reviews.llvm.org/D47046 llvm-svn: 332769
Diffstat (limited to 'llvm/lib/Object/WasmObjectFile.cpp')
-rw-r--r--llvm/lib/Object/WasmObjectFile.cpp12
1 files changed, 9 insertions, 3 deletions
diff --git a/llvm/lib/Object/WasmObjectFile.cpp b/llvm/lib/Object/WasmObjectFile.cpp
index f6e2d92c031..d15ff943eb6 100644
--- a/llvm/lib/Object/WasmObjectFile.cpp
+++ b/llvm/lib/Object/WasmObjectFile.cpp
@@ -112,19 +112,22 @@ static int64_t readLEB128(const uint8_t *&Ptr) {
static uint8_t readVaruint1(const uint8_t *&Ptr) {
int64_t result = readLEB128(Ptr);
- assert(result <= VARUINT1_MAX && result >= 0);
+ if (result > VARUINT1_MAX || result < 0)
+ report_fatal_error("LEB is outside Varuint1 range");
return result;
}
static int32_t readVarint32(const uint8_t *&Ptr) {
int64_t result = readLEB128(Ptr);
- assert(result <= INT32_MAX && result >= INT32_MIN);
+ if (result > INT32_MAX || result < INT32_MIN)
+ report_fatal_error("LEB is outside Varint32 range");
return result;
}
static uint32_t readVaruint32(const uint8_t *&Ptr) {
uint64_t result = readULEB128(Ptr);
- assert(result <= UINT32_MAX);
+ if (result > UINT32_MAX)
+ report_fatal_error("LEB is outside Varuint32 range");
return result;
}
@@ -955,6 +958,9 @@ Error WasmObjectFile::parseDataSection(const uint8_t *Ptr, const uint8_t *End) {
if (Error Err = readInitExpr(Segment.Data.Offset, Ptr))
return Err;
uint32_t Size = readVaruint32(Ptr);
+ if (Size > End - Ptr)
+ return make_error<GenericBinaryError>("Invalid segment size",
+ object_error::parse_failed);
Segment.Data.Content = ArrayRef<uint8_t>(Ptr, Size);
// The rest of these Data fields are set later, when reading in the linking
// metadata section.
OpenPOWER on IntegriCloud