Skip to content

Commit 4c12a7a

Browse files
committed
Disables threads by default.
1 parent 2e31ca2 commit 4c12a7a

File tree

2 files changed

+63
-12
lines changed

2 files changed

+63
-12
lines changed

src/tests.rs

+8-3
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,12 @@ mod simple_tests {
1919
use std::fs::{File, read_dir};
2020
use std::path::PathBuf;
2121
use parser::{WasmDecoder, Parser, ParserState, ParserInput, SectionCode, Operator};
22-
use validator::ValidatingParser;
22+
use validator::{ValidatingParser, ValidatingParserConfig, OperatorValidatorConfig};
23+
24+
const VALIDATOR_CONFIG: Option<ValidatingParserConfig> =
25+
Some(ValidatingParserConfig {
26+
operator_config: OperatorValidatorConfig { enable_threads: true },
27+
});
2328

2429
fn read_file_data(path: &PathBuf) -> Vec<u8> {
2530
println!("Parsing {:?}", path);
@@ -62,7 +67,7 @@ mod simple_tests {
6267
continue;
6368
}
6469
let data = read_file_data(&dir.path());
65-
let mut parser = ValidatingParser::new(data.as_slice());
70+
let mut parser = ValidatingParser::new(data.as_slice(), VALIDATOR_CONFIG);
6671
let mut max_iteration = 100000000;
6772
loop {
6873
let state = parser.read();
@@ -87,7 +92,7 @@ mod simple_tests {
8792
continue;
8893
}
8994
let data = read_file_data(&dir.path());
90-
let mut parser = ValidatingParser::new(data.as_slice());
95+
let mut parser = ValidatingParser::new(data.as_slice(), VALIDATOR_CONFIG);
9196
let mut max_iteration = 100000000;
9297
let mut error = false;
9398
loop {

src/validator.rs

+55-9
Original file line numberDiff line numberDiff line change
@@ -275,12 +275,24 @@ pub trait WasmModuleResources {
275275

276276
type OperatorValidatorResult<T> = result::Result<T, &'static str>;
277277

278+
#[derive(Copy,Clone)]
279+
pub struct OperatorValidatorConfig {
280+
pub enable_threads: bool,
281+
}
282+
283+
const DEFAULT_OPERATOR_VALIDATOR_CONFIG: OperatorValidatorConfig =
284+
OperatorValidatorConfig { enable_threads: false };
285+
278286
struct OperatorValidator {
279287
func_state: FuncState,
288+
config: OperatorValidatorConfig,
280289
}
281290

282291
impl OperatorValidator {
283-
pub fn new(func_type: &FuncType, locals: &Vec<(u32, Type)>) -> OperatorValidator {
292+
pub fn new(func_type: &FuncType,
293+
locals: &Vec<(u32, Type)>,
294+
config: OperatorValidatorConfig)
295+
-> OperatorValidator {
284296
let mut local_types = Vec::new();
285297
local_types.extend_from_slice(func_type.params.as_slice());
286298
for local in locals {
@@ -308,6 +320,7 @@ impl OperatorValidator {
308320
stack_types: Vec::new(),
309321
end_function: false,
310322
},
323+
config,
311324
}
312325
}
313326

@@ -477,6 +490,13 @@ impl OperatorValidator {
477490
Ok(())
478491
}
479492

493+
fn check_threads_enabled(&self) -> OperatorValidatorResult<()> {
494+
if !self.config.enable_threads {
495+
return Err("threads support is not enabled");
496+
}
497+
Ok(())
498+
}
499+
480500
fn check_shared_memarg_wo_align(&self,
481501
_: &MemoryImmediate,
482502
resources: &WasmModuleResources)
@@ -1022,6 +1042,7 @@ impl OperatorValidator {
10221042
Operator::I32AtomicLoad { ref memarg } |
10231043
Operator::I32AtomicLoad16U { ref memarg } |
10241044
Operator::I32AtomicLoad8U { ref memarg } => {
1045+
self.check_threads_enabled()?;
10251046
self.check_shared_memarg_wo_align(memarg, resources)?;
10261047
self.check_operands_1(func_state, Type::I32)?;
10271048
OperatorAction::ChangeFrameWithType(1, Type::I32)
@@ -1030,13 +1051,15 @@ impl OperatorValidator {
10301051
Operator::I64AtomicLoad32U { ref memarg } |
10311052
Operator::I64AtomicLoad16U { ref memarg } |
10321053
Operator::I64AtomicLoad8U { ref memarg } => {
1054+
self.check_threads_enabled()?;
10331055
self.check_shared_memarg_wo_align(memarg, resources)?;
10341056
self.check_operands_1(func_state, Type::I32)?;
10351057
OperatorAction::ChangeFrameWithType(1, Type::I64)
10361058
}
10371059
Operator::I32AtomicStore { ref memarg } |
10381060
Operator::I32AtomicStore16 { ref memarg } |
10391061
Operator::I32AtomicStore8 { ref memarg } => {
1062+
self.check_threads_enabled()?;
10401063
self.check_shared_memarg_wo_align(memarg, resources)?;
10411064
self.check_operands_2(func_state, Type::I32, Type::I32)?;
10421065
OperatorAction::ChangeFrame(2)
@@ -1045,6 +1068,7 @@ impl OperatorValidator {
10451068
Operator::I64AtomicStore32 { ref memarg } |
10461069
Operator::I64AtomicStore16 { ref memarg } |
10471070
Operator::I64AtomicStore8 { ref memarg } => {
1071+
self.check_threads_enabled()?;
10481072
self.check_shared_memarg_wo_align(memarg, resources)?;
10491073
self.check_operands_2(func_state, Type::I32, Type::I64)?;
10501074
OperatorAction::ChangeFrame(2)
@@ -1064,6 +1088,7 @@ impl OperatorValidator {
10641088
Operator::I32AtomicRmw8UAnd { ref memarg } |
10651089
Operator::I32AtomicRmw8UOr { ref memarg } |
10661090
Operator::I32AtomicRmw8UXor { ref memarg } => {
1091+
self.check_threads_enabled()?;
10671092
self.check_shared_memarg_wo_align(memarg, resources)?;
10681093
self.check_operands_2(func_state, Type::I32, Type::I32)?;
10691094
OperatorAction::ChangeFrameWithType(2, Type::I32)
@@ -1088,20 +1113,23 @@ impl OperatorValidator {
10881113
Operator::I64AtomicRmw8UAnd { ref memarg } |
10891114
Operator::I64AtomicRmw8UOr { ref memarg } |
10901115
Operator::I64AtomicRmw8UXor { ref memarg } => {
1116+
self.check_threads_enabled()?;
10911117
self.check_shared_memarg_wo_align(memarg, resources)?;
10921118
self.check_operands_2(func_state, Type::I32, Type::I64)?;
10931119
OperatorAction::ChangeFrameWithType(2, Type::I64)
10941120
}
10951121
Operator::I32AtomicRmwXchg { ref memarg } |
10961122
Operator::I32AtomicRmw16UXchg { ref memarg } |
10971123
Operator::I32AtomicRmw8UXchg { ref memarg } => {
1124+
self.check_threads_enabled()?;
10981125
self.check_shared_memarg_wo_align(memarg, resources)?;
10991126
self.check_operands_2(func_state, Type::I32, Type::I32)?;
11001127
OperatorAction::ChangeFrameWithType(2, Type::I32)
11011128
}
11021129
Operator::I32AtomicRmwCmpxchg { ref memarg } |
11031130
Operator::I32AtomicRmw16UCmpxchg { ref memarg } |
11041131
Operator::I32AtomicRmw8UCmpxchg { ref memarg } => {
1132+
self.check_threads_enabled()?;
11051133
self.check_shared_memarg_wo_align(memarg, resources)?;
11061134
self.check_operands(func_state, &[Type::I32, Type::I32, Type::I32])?;
11071135
OperatorAction::ChangeFrameWithType(3, Type::I32)
@@ -1110,6 +1138,7 @@ impl OperatorValidator {
11101138
Operator::I64AtomicRmw32UXchg { ref memarg } |
11111139
Operator::I64AtomicRmw16UXchg { ref memarg } |
11121140
Operator::I64AtomicRmw8UXchg { ref memarg } => {
1141+
self.check_threads_enabled()?;
11131142
self.check_shared_memarg_wo_align(memarg, resources)?;
11141143
self.check_operands_2(func_state, Type::I32, Type::I64)?;
11151144
OperatorAction::ChangeFrameWithType(2, Type::I64)
@@ -1118,21 +1147,25 @@ impl OperatorValidator {
11181147
Operator::I64AtomicRmw32UCmpxchg { ref memarg } |
11191148
Operator::I64AtomicRmw16UCmpxchg { ref memarg } |
11201149
Operator::I64AtomicRmw8UCmpxchg { ref memarg } => {
1150+
self.check_threads_enabled()?;
11211151
self.check_shared_memarg_wo_align(memarg, resources)?;
11221152
self.check_operands(func_state, &[Type::I32, Type::I64, Type::I64])?;
11231153
OperatorAction::ChangeFrameWithType(3, Type::I64)
11241154
}
11251155
Operator::Wake { ref memarg } => {
1156+
self.check_threads_enabled()?;
11261157
self.check_shared_memarg_wo_align(memarg, resources)?;
11271158
self.check_operands_2(func_state, Type::I32, Type::I32)?;
11281159
OperatorAction::ChangeFrameWithType(2, Type::I32)
11291160
}
11301161
Operator::I32Wait { ref memarg } => {
1162+
self.check_threads_enabled()?;
11311163
self.check_shared_memarg_wo_align(memarg, resources)?;
11321164
self.check_operands(func_state, &[Type::I32, Type::I32, Type::I64])?;
11331165
OperatorAction::ChangeFrameWithType(3, Type::I32)
11341166
}
11351167
Operator::I64Wait { ref memarg } => {
1168+
self.check_threads_enabled()?;
11361169
self.check_shared_memarg_wo_align(memarg, resources)?;
11371170
self.check_operands(func_state, &[Type::I32, Type::I64, Type::I64])?;
11381171
OperatorAction::ChangeFrameWithType(3, Type::I32)
@@ -1149,6 +1182,14 @@ impl OperatorValidator {
11491182
}
11501183
}
11511184

1185+
#[derive(Copy,Clone)]
1186+
pub struct ValidatingParserConfig {
1187+
pub operator_config: OperatorValidatorConfig,
1188+
}
1189+
1190+
const DEFAULT_VALIDATING_PARSER_CONFIG: ValidatingParserConfig =
1191+
ValidatingParserConfig { operator_config: DEFAULT_OPERATOR_VALIDATOR_CONFIG };
1192+
11521193
pub struct ValidatingParser<'a> {
11531194
parser: Parser<'a>,
11541195
validation_error: Option<ParserState<'a>>,
@@ -1164,6 +1205,7 @@ pub struct ValidatingParser<'a> {
11641205
init_expression_state: Option<InitExpressionState>,
11651206
exported_names: HashSet<Vec<u8>>,
11661207
current_operator_validator: Option<OperatorValidator>,
1208+
config: ValidatingParserConfig,
11671209
}
11681210

11691211
impl<'a> WasmModuleResources for ValidatingParser<'a> {
@@ -1189,7 +1231,7 @@ impl<'a> WasmModuleResources for ValidatingParser<'a> {
11891231
}
11901232

11911233
impl<'a> ValidatingParser<'a> {
1192-
pub fn new(bytes: &[u8]) -> ValidatingParser {
1234+
pub fn new(bytes: &[u8], config: Option<ValidatingParserConfig>) -> ValidatingParser {
11931235
ValidatingParser {
11941236
parser: Parser::new(bytes),
11951237
validation_error: None,
@@ -1205,6 +1247,7 @@ impl<'a> ValidatingParser<'a> {
12051247
current_operator_validator: None,
12061248
init_expression_state: None,
12071249
exported_names: HashSet::new(),
1250+
config: config.unwrap_or(DEFAULT_VALIDATING_PARSER_CONFIG),
12081251
}
12091252
}
12101253

@@ -1622,7 +1665,9 @@ impl<'a> ValidatingParser<'a> {
16221665
ParserState::FunctionBodyLocals { ref locals } => {
16231666
let index = (self.current_func_index + self.func_imports_count) as usize;
16241667
let ref func_type = self.types[self.func_type_indices[index] as usize];
1625-
self.current_operator_validator = Some(OperatorValidator::new(func_type, locals));
1668+
let operator_config = self.config.operator_config;
1669+
self.current_operator_validator =
1670+
Some(OperatorValidator::new(func_type, locals, operator_config));
16261671
}
16271672
ParserState::CodeOperator(ref operator) => {
16281673
let check = self.current_operator_validator
@@ -1675,7 +1720,8 @@ impl<'a> ValidatingParser<'a> {
16751720
ParserState::FunctionBodyLocals { ref locals } => {
16761721
let index = (self.current_func_index + self.func_imports_count) as usize;
16771722
let ref func_type = self.types[self.func_type_indices[index] as usize];
1678-
OperatorValidator::new(func_type, locals)
1723+
let operator_config = self.config.operator_config;
1724+
OperatorValidator::new(func_type, locals, operator_config)
16791725
}
16801726
_ => panic!("Invalid reader state"),
16811727
};
@@ -1763,7 +1809,7 @@ impl<'b> ValidatingOperatorParser<'b> {
17631809
/// # 0x2, 0x83, 0x80, 0x80, 0x80, 0x0, 0x0, 0x1, 0xb, 0x83,
17641810
/// # 0x80, 0x80, 0x80, 0x0, 0x0, 0x0, 0xb];
17651811
/// use wasmparser::{WasmDecoder, ParserState, ValidatingParser};
1766-
/// let mut parser = ValidatingParser::new(data);
1812+
/// let mut parser = ValidatingParser::new(data, None);
17671813
/// let mut validating_parsers = Vec::new();
17681814
/// loop {
17691815
/// {
@@ -1813,8 +1859,8 @@ impl<'b> ValidatingOperatorParser<'b> {
18131859

18141860
/// Test whether the given buffer contains a valid WebAssembly module,
18151861
/// analogous to WebAssembly.validate in the JS API.
1816-
pub fn validate(bytes: &[u8]) -> bool {
1817-
let mut parser = ValidatingParser::new(bytes);
1862+
pub fn validate(bytes: &[u8], config: Option<ValidatingParserConfig>) -> bool {
1863+
let mut parser = ValidatingParser::new(bytes, config);
18181864
loop {
18191865
let state = parser.read();
18201866
match *state {
@@ -1827,6 +1873,6 @@ pub fn validate(bytes: &[u8]) -> bool {
18271873

18281874
#[test]
18291875
fn test_validate() {
1830-
assert!(validate(&[0x0, 0x61, 0x73, 0x6d, 0x1, 0x0, 0x0, 0x0]));
1831-
assert!(!validate(&[0x0, 0x61, 0x73, 0x6d, 0x2, 0x0, 0x0, 0x0]));
1876+
assert!(validate(&[0x0, 0x61, 0x73, 0x6d, 0x1, 0x0, 0x0, 0x0], None));
1877+
assert!(!validate(&[0x0, 0x61, 0x73, 0x6d, 0x2, 0x0, 0x0, 0x0], None));
18321878
}

0 commit comments

Comments
 (0)