Skip to content

Commit 10b03c8

Browse files
committed
Validate memarg offsets
For 32-bit memories, the offset value must be in the u32 range. Update the address.wast spec test to assert that a module with an overlarge offset value is invalid rather than malformed.
1 parent 5634d64 commit 10b03c8

File tree

3 files changed

+14
-3
lines changed

3 files changed

+14
-3
lines changed

scripts/test/shared.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -399,9 +399,8 @@ def get_tests(test_dir, extensions=[], recursive=False):
399399
# delete the old file, make sure you rename the corresponding .wast.log file in
400400
# expected-output/ if any.
401401
SPEC_TESTS_TO_SKIP = [
402-
# Malformed module accepted
402+
# Requires us to write our own floating point parser
403403
'const.wast',
404-
'address.wast',
405404

406405
# Unlinkable module accepted
407406
'linking.wast',

src/wasm/wasm-validator.cpp

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -526,6 +526,7 @@ struct FunctionValidator : public WalkerPass<PostWalker<FunctionValidator>> {
526526
return info.shouldBeSubType(left, right, curr, text, getFunction());
527527
}
528528

529+
void validateOffset(Address offset, Memory* mem, Expression* curr);
529530
void validateAlignment(
530531
size_t align, Type type, Index bytes, bool isAtomic, Expression* curr);
531532
void validateMemBytes(uint8_t bytes, Type type, Expression* curr);
@@ -1046,6 +1047,7 @@ void FunctionValidator::visitLoad(Load* curr) {
10461047
"SIMD operations require SIMD [--enable-simd]");
10471048
}
10481049
validateMemBytes(curr->bytes, curr->type, curr);
1050+
validateOffset(curr->offset, memory, curr);
10491051
validateAlignment(curr->align, curr->type, curr->bytes, curr->isAtomic, curr);
10501052
shouldBeEqualOrFirstIsUnreachable(
10511053
curr->ptr->type,
@@ -1077,6 +1079,7 @@ void FunctionValidator::visitStore(Store* curr) {
10771079
"SIMD operations require SIMD [--enable-simd]");
10781080
}
10791081
validateMemBytes(curr->bytes, curr->valueType, curr);
1082+
validateOffset(curr->offset, memory, curr);
10801083
validateAlignment(
10811084
curr->align, curr->valueType, curr->bytes, curr->isAtomic, curr);
10821085
shouldBeEqualOrFirstIsUnreachable(
@@ -1370,6 +1373,7 @@ void FunctionValidator::visitSIMDLoad(SIMDLoad* curr) {
13701373
break;
13711374
}
13721375
Index bytes = curr->getMemBytes();
1376+
validateOffset(curr->offset, memory, curr);
13731377
validateAlignment(curr->align, memAlignType, bytes, /*isAtomic=*/false, curr);
13741378
}
13751379

@@ -1423,6 +1427,7 @@ void FunctionValidator::visitSIMDLoadStoreLane(SIMDLoadStoreLane* curr) {
14231427
WASM_UNREACHABLE("Unexpected SIMDLoadStoreLane op");
14241428
}
14251429
Index bytes = curr->getMemBytes();
1430+
validateOffset(curr->offset, memory, curr);
14261431
validateAlignment(curr->align, memAlignType, bytes, /*isAtomic=*/false, curr);
14271432
shouldBeTrue(curr->index < lanes, curr, "invalid lane index");
14281433
}
@@ -3457,6 +3462,13 @@ void FunctionValidator::visitFunction(Function* curr) {
34573462
}
34583463
}
34593464

3465+
void FunctionValidator::validateOffset(Address offset,
3466+
Memory* mem,
3467+
Expression* curr) {
3468+
shouldBeTrue(
3469+
mem->is64() || offset < (1ull << 32), curr, "offset must be u32");
3470+
}
3471+
34603472
void FunctionValidator::validateAlignment(
34613473
size_t align, Type type, Index bytes, bool isAtomic, Expression* curr) {
34623474
if (isAtomic) {

test/spec/address.wast

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -203,7 +203,7 @@
203203
(assert_trap (invoke "16s_bad" (i32.const 1)) "out of bounds memory access")
204204
(assert_trap (invoke "32_bad" (i32.const 1)) "out of bounds memory access")
205205

206-
(assert_malformed
206+
(assert_invalid
207207
(module quote
208208
"(memory 1)"
209209
"(func (drop (i32.load offset=4294967296 (i32.const 0))))"

0 commit comments

Comments
 (0)