summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlon Zakai <alonzakai@gmail.com>2018-03-16 09:40:30 -0700
committerGitHub <noreply@github.com>2018-03-16 09:40:30 -0700
commit963b585bf66a6b9a31c13f244f1e6612d0c96991 (patch)
tree749dc5b77a85d64e7680d512060e19f5fc5c7fad
parentd37e6942a011ac72cf59934ca26c1993e37a23fd (diff)
downloadbinaryen-963b585bf66a6b9a31c13f244f1e6612d0c96991.tar.gz
binaryen-963b585bf66a6b9a31c13f244f1e6612d0c96991.tar.bz2
binaryen-963b585bf66a6b9a31c13f244f1e6612d0c96991.zip
check for errors when parsing s-expression load/store immediates (#1475)
-rw-r--r--src/wasm/wasm-s-parser.cpp8
1 files changed, 6 insertions, 2 deletions
diff --git a/src/wasm/wasm-s-parser.cpp b/src/wasm/wasm-s-parser.cpp
index 5887adfae..a185e02c3 100644
--- a/src/wasm/wasm-s-parser.cpp
+++ b/src/wasm/wasm-s-parser.cpp
@@ -1167,7 +1167,12 @@ static size_t parseMemAttributes(Element& s, Address* offset, Address* align, Ad
const char *eq = strchr(str, '=');
if (!eq) throw ParseException("missing = in memory attribute");
eq++;
- uint64_t value = atoll(eq);
+ if (*eq == 0) throw ParseException("missing value in memory attribute", s.line, s.col);
+ char* endptr;
+ uint64_t value = strtoll(eq, &endptr, 10);
+ if (*endptr != 0) {
+ throw ParseException("bad memory attribute immediate", s.line, s.col);
+ }
if (str[0] == 'a') {
if (value > std::numeric_limits<uint32_t>::max()) throw ParseException("bad align");
*align = value;
@@ -1202,7 +1207,6 @@ Expression* SExpressionWasmBuilder::makeStore(Element& s, Type type, bool isAtom
ret->valueType = type;
ret->bytes = parseMemBytes(&extra, getTypeSize(type));
size_t i = parseMemAttributes(s, &ret->offset, &ret->align, ret->bytes);
-
ret->ptr = parseExpression(s[i]);
ret->value = parseExpression(s[i+1]);
ret->finalize();