summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-xcheck.py2
-rw-r--r--src/parsing.h6
-rw-r--r--test/passes/vacuum.wast2
-rw-r--r--test/passes/vacuum_ignore-implicit-traps.wast2
-rw-r--r--test/validator/invalid_number.wast6
5 files changed, 16 insertions, 2 deletions
diff --git a/check.py b/check.py
index 07d68f8dd..d78ed022f 100755
--- a/check.py
+++ b/check.py
@@ -468,6 +468,8 @@ def run_validator_tests():
run_command(cmd, expected_status=1)
cmd = WASM_AS + ['--validate=none', os.path.join(options.binaryen_test, 'validator', 'invalid_return.wast')]
run_command(cmd)
+ cmd = WASM_AS + [os.path.join(options.binaryen_test, 'validator', 'invalid_number.wast')]
+ run_command(cmd, expected_status=1)
def run_vanilla_tests():
diff --git a/src/parsing.h b/src/parsing.h
index 06797cf54..c6a3b8a83 100644
--- a/src/parsing.h
+++ b/src/parsing.h
@@ -126,6 +126,7 @@ inline Expression* parseConst(cashew::IString s, Type type, MixedArena& allocato
if (modifier) {
std::istringstream istr(modifier);
istr >> std::hex >> pattern;
+ if (istr.fail()) throw ParseException("invalid f32 format");
pattern |= 0x7f800000U;
} else {
pattern = 0x7fc00000U;
@@ -140,6 +141,7 @@ inline Expression* parseConst(cashew::IString s, Type type, MixedArena& allocato
if (modifier) {
std::istringstream istr(modifier);
istr >> std::hex >> pattern;
+ if (istr.fail()) throw ParseException("invalid f64 format");
pattern |= 0x7ff0000000000000ULL;
} else {
pattern = 0x7ff8000000000000UL;
@@ -172,11 +174,13 @@ inline Expression* parseConst(cashew::IString s, Type type, MixedArena& allocato
std::istringstream istr(str);
uint32_t temp;
istr >> std::hex >> temp;
+ if (istr.fail()) throw ParseException("invalid i32 format");
ret->value = Literal(negative ? -temp : temp);
} else {
std::istringstream istr(str[0] == '-' ? str + 1 : str);
uint32_t temp;
istr >> temp;
+ if (istr.fail()) throw ParseException("invalid i32 format");
ret->value = Literal(str[0] == '-' ? -temp : temp);
}
break;
@@ -188,11 +192,13 @@ inline Expression* parseConst(cashew::IString s, Type type, MixedArena& allocato
std::istringstream istr(str);
uint64_t temp;
istr >> std::hex >> temp;
+ if (istr.fail()) throw ParseException("invalid i64 format");
ret->value = Literal(negative ? -temp : temp);
} else {
std::istringstream istr(str[0] == '-' ? str + 1 : str);
uint64_t temp;
istr >> temp;
+ if (istr.fail()) throw ParseException("invalid i64 format");
ret->value = Literal(str[0] == '-' ? -temp : temp);
}
break;
diff --git a/test/passes/vacuum.wast b/test/passes/vacuum.wast
index dbbffee41..8552c8282 100644
--- a/test/passes/vacuum.wast
+++ b/test/passes/vacuum.wast
@@ -583,7 +583,7 @@
(func $unary-binary-may-trap
(drop
(i64.div_s
- (i64.const 70847791997969805621592064)
+ (i64.const -1)
(i64.const 729618461987467893)
)
)
diff --git a/test/passes/vacuum_ignore-implicit-traps.wast b/test/passes/vacuum_ignore-implicit-traps.wast
index 21e87e10c..de409e782 100644
--- a/test/passes/vacuum_ignore-implicit-traps.wast
+++ b/test/passes/vacuum_ignore-implicit-traps.wast
@@ -18,7 +18,7 @@
(func $unary-binary-may-trap
(drop
(i64.div_s
- (i64.const 70847791997969805621592064)
+ (i64.const -1)
(i64.const 729618461987467893)
)
)
diff --git a/test/validator/invalid_number.wast b/test/validator/invalid_number.wast
new file mode 100644
index 000000000..6ea531bfb
--- /dev/null
+++ b/test/validator/invalid_number.wast
@@ -0,0 +1,6 @@
+(module
+ (func $invalid_number
+ (i64.const 70847791997969805621592064)
+ )
+)
+