1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
use move_binary_format::{
access::ModuleAccess,
errors::{verification_error, Location, PartialVMResult, VMResult},
file_format::{CompiledModule, CompiledScript, Constant, SignatureToken, TableIndex},
IndexKind,
};
use move_core_types::vm_status::StatusCode;
pub fn verify_module(module: &CompiledModule) -> VMResult<()> {
verify_module_impl(module).map_err(|e| e.finish(Location::Module(module.self_id())))
}
fn verify_module_impl(module: &CompiledModule) -> PartialVMResult<()> {
for (idx, constant) in module.constant_pool().iter().enumerate() {
verify_constant(idx, constant)?
}
Ok(())
}
pub fn verify_script(module: &CompiledScript) -> VMResult<()> {
verify_script_impl(module).map_err(|e| e.finish(Location::Script))
}
fn verify_script_impl(script: &CompiledScript) -> PartialVMResult<()> {
for (idx, constant) in script.constant_pool.iter().enumerate() {
verify_constant(idx, constant)?
}
Ok(())
}
fn verify_constant(idx: usize, constant: &Constant) -> PartialVMResult<()> {
verify_constant_type(idx, &constant.type_)?;
verify_constant_data(idx, constant)
}
fn verify_constant_type(idx: usize, type_: &SignatureToken) -> PartialVMResult<()> {
if type_.is_valid_for_constant() {
Ok(())
} else {
Err(verification_error(
StatusCode::INVALID_CONSTANT_TYPE,
IndexKind::ConstantPool,
idx as TableIndex,
))
}
}
fn verify_constant_data(idx: usize, constant: &Constant) -> PartialVMResult<()> {
match constant.deserialize_constant() {
Some(_) => Ok(()),
None => Err(verification_error(
StatusCode::MALFORMED_CONSTANT_DATA,
IndexKind::ConstantPool,
idx as TableIndex,
)),
}
}