Skip to content

Commit 9e21dca

Browse files
authored
fix: check number of argument at init_module verification (#41)
* check number of argument in init_module function * allow empty argument init_module
1 parent 65f4773 commit 9e21dca

File tree

3 files changed

+23
-6
lines changed

3 files changed

+23
-6
lines changed

crates/compiler/src/extended_checks.rs

+6
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,12 @@ impl<'a> ExtendedChecker<'a> {
9393
);
9494
}
9595
}
96+
if fun.get_parameters().len() > 1 {
97+
self.env.error(
98+
&fun.get_loc(),
99+
"`init_module` function can only take at most one parameter",
100+
);
101+
}
96102
if fun.get_return_count() > 0 {
97103
self.env.error(
98104
&fun.get_loc(),

crates/vm/src/move_vm.rs

+8-4
Original file line numberDiff line numberDiff line change
@@ -581,10 +581,14 @@ impl MoveVM {
581581
// with the general verify_module above.
582582
if init_function.is_ok() {
583583
if verify_module_init_function(module).is_ok() {
584-
let args: Vec<Vec<u8>> = senders
585-
.iter()
586-
.map(|s| MoveValue::Signer(*s).simple_serialize().unwrap())
587-
.collect();
584+
let args: Vec<Vec<u8>> = if init_function.unwrap().parameters.is_empty() {
585+
vec![]
586+
} else {
587+
senders
588+
.iter()
589+
.map(|s| MoveValue::Signer(*s).simple_serialize().unwrap())
590+
.collect()
591+
};
588592

589593
// first execution does not execute `charge_call`, so need to record call here
590594
gas_meter.record_call(&module.self_id());

crates/vm/src/verifier/module_init.rs

+9-2
Original file line numberDiff line numberDiff line change
@@ -31,15 +31,22 @@ pub(crate) fn verify_module_init_function(module: &CompiledModule) -> PartialVMR
3131
}
3232

3333
let fhandle = module.function_handle_at(fdef.function);
34-
let parameters = module.signature_at(fhandle.parameters);
3534

35+
// check init_module has no return
3636
let return_ = module.signature_at(fhandle.return_);
37-
3837
if !return_.0.is_empty() {
3938
return Err(PartialVMError::new(StatusCode::VERIFICATION_ERROR)
4039
.with_message("module_init_function should not return".to_string()));
4140
}
4241

42+
// check init_module has exactly one argument
43+
let parameters = module.signature_at(fhandle.parameters);
44+
if parameters.0.len() > 1 {
45+
return Err(PartialVMError::new(StatusCode::VERIFICATION_ERROR)
46+
.with_message("module_init_function can only take at most one parameter".to_string()));
47+
}
48+
49+
// check init_module has only signer arguments
4350
let non_signer_tokens = parameters
4451
.0
4552
.iter()

0 commit comments

Comments
 (0)