Skip to content

Commit 0c1e651

Browse files
authored
Fix panic caused by struct in verifier (rooch-network#3186)
1 parent d30d4fa commit 0c1e651

File tree

1 file changed

+14
-12
lines changed

1 file changed

+14
-12
lines changed

moveos/moveos-verifier/src/verifier.rs

+14-12
Original file line numberDiff line numberDiff line change
@@ -1181,7 +1181,7 @@ fn struct_def_from_struct_handle<Resolver>(
11811181
verified_modules: &mut BTreeMap<ModuleId, CompiledModule>,
11821182
struct_name: &str,
11831183
db: &Resolver,
1184-
) -> Option<StructDefinition>
1184+
) -> Option<(StructDefinition, CompiledModule)>
11851185
where
11861186
Resolver: ModuleResolver,
11871187
{
@@ -1191,7 +1191,7 @@ where
11911191
let iterator_struct_name =
11921192
struct_full_name_from_sid(&struct_handle_idx, &current_module_bin_view);
11931193
if iterator_struct_name == struct_name {
1194-
return Some(struct_def.clone());
1194+
return Some((struct_def.clone(), current_module.clone()));
11951195
}
11961196
}
11971197

@@ -1202,7 +1202,7 @@ where
12021202
let iterator_struct_name =
12031203
struct_full_name_from_sid(&struct_handle_idx, &iterator_module_bin_view);
12041204
if iterator_struct_name == struct_name {
1205-
return Some(struct_def.clone());
1205+
return Some((struct_def.clone(), m.clone()));
12061206
}
12071207
}
12081208
}
@@ -1220,7 +1220,7 @@ where
12201220
let iterator_struct_name =
12211221
struct_full_name_from_sid(&struct_handle_idx, &target_module_bin_view);
12221222
if iterator_struct_name == struct_name {
1223-
return Some(struct_def.clone());
1223+
return Some((struct_def.clone(), target_module));
12241224
}
12251225
}
12261226
None
@@ -1455,7 +1455,7 @@ where
14551455
db,
14561456
);
14571457
match struct_def_opt {
1458-
Some(struct_def) => validate_struct_fields(
1458+
Some((struct_def, _)) => validate_struct_fields(
14591459
&struct_def,
14601460
current_module,
14611461
module_bin_view,
@@ -1910,19 +1910,21 @@ where
19101910
);
19111911

19121912
let mut struct_fields = Vec::new();
1913-
if let Some(struct_def) = struct_def_opt {
1914-
let field_count = struct_def.declared_field_count().unwrap();
1915-
for field_idx in 0..field_count {
1916-
let field_def = struct_def.field(field_idx as usize).unwrap().clone();
1917-
struct_fields.push(field_def);
1918-
}
1913+
let mut target_module = caller_module.clone();
1914+
if let Some((struct_def, m)) = struct_def_opt {
1915+
let v = match struct_def.field_information {
1916+
StructFieldInformation::Native => vec![],
1917+
StructFieldInformation::Declared(v) => v,
1918+
};
1919+
target_module = m.clone();
1920+
struct_fields.extend(v);
19191921
}
19201922

19211923
let formulas = struct_fields
19221924
.iter()
19231925
.map(|field_def| {
19241926
calculate_depth_of_type(
1925-
caller_module,
1927+
&target_module,
19261928
verified_modules,
19271929
db,
19281930
&field_def.signature.0.clone(),

0 commit comments

Comments
 (0)