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 <qjerome@users.noreply.github.com>
pull/530/head
Quentin JEROME 2 years ago
parent 770ab66e9c
commit 1db17d5ad3

@ -53,8 +53,13 @@ impl StructHelper {
let member_name = btf.string_at(m.name_offset)?; let member_name = btf.string_at(m.name_offset)?;
// we get the member type // we get the member type
let member_type = btf.type_by_id(m.btf_type)?; let member_type = btf.type_by_id(m.btf_type)?;
let member_size = member_type.size().unwrap_or_default(); let mut member_size = member_type.size().unwrap_or_default();
let p = MemberPath::from_other_with_name(member_path, member_name.to_string());
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 { match member_type {
BtfType::Struct(_) => { BtfType::Struct(_) => {
@ -82,6 +87,17 @@ impl StructHelper {
Some(btf.type_by_id(array.array.element_type)?.clone()), 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( self.members.push(MemberHelper::new(
p, p,
@ -287,6 +303,9 @@ mod test {
let hlist_node = StructHelper::from_btf(&btf, "hlist_node").unwrap(); 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("next").unwrap().offset, 0);
assert_eq!(hlist_node.get_member("pprev").unwrap().offset, ptr_size); 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] #[test]

Loading…
Cancel
Save