From 1db17d5ad3b804ef2048123ea0c79ab22d00f1b3 Mon Sep 17 00:00:00 2001 From: Quentin JEROME Date: Fri, 24 Feb 2023 19:38:50 +0100 Subject: [PATCH] Fixed bugs in btf helpers: * typedef were not handled properly and were generating wrong offsets * anonymous structures were not handled properly and were generating garbage members Signed-off-by: Quentin JEROME --- aya-obj/src/btf/helpers.rs | 23 +++++++++++++++++++++-- 1 file changed, 21 insertions(+), 2 deletions(-) diff --git a/aya-obj/src/btf/helpers.rs b/aya-obj/src/btf/helpers.rs index aa7a5a72..c98de246 100644 --- a/aya-obj/src/btf/helpers.rs +++ b/aya-obj/src/btf/helpers.rs @@ -53,8 +53,13 @@ impl StructHelper { let member_name = btf.string_at(m.name_offset)?; // we get the member type let member_type = btf.type_by_id(m.btf_type)?; - let member_size = member_type.size().unwrap_or_default(); - let p = MemberPath::from_other_with_name(member_path, member_name.to_string()); + let mut member_size = member_type.size().unwrap_or_default(); + + let mut p = member_path.clone(); + // if not anonymous + if !member_name.is_empty() { + p = MemberPath::from_other_with_name(member_path, member_name.to_string()); + } match member_type { BtfType::Struct(_) => { @@ -82,6 +87,17 @@ impl StructHelper { Some(btf.type_by_id(array.array.element_type)?.clone()), )); } + + BtfType::Typedef(td) => { + member_size = btf.type_by_id(td.btf_type)?.size().unwrap_or_default(); + self.members.push(MemberHelper::new( + p, + member_offset, + member_type.clone(), + None, + )); + } + _ => { self.members.push(MemberHelper::new( p, @@ -287,6 +303,9 @@ mod test { let hlist_node = StructHelper::from_btf(&btf, "hlist_node").unwrap(); assert_eq!(hlist_node.get_member("next").unwrap().offset, 0); assert_eq!(hlist_node.get_member("pprev").unwrap().offset, ptr_size); + + let dentry = StructHelper::from_btf(&btf, "dentry").unwrap(); + assert_eq!(dentry.get_member("d_name").unwrap().offset, 32); } #[test]