|
@@ -535,24 +535,44 @@ impl Btf {
|
|
|
let enum_type = BtfType::Enum(Enum::new(ty.name_offset, members));
|
|
|
types.types[i] = enum_type;
|
|
|
}
|
|
|
+
|
|
|
// Sanitize FUNC
|
|
|
- BtfType::Func(ty) if !features.btf_func => {
|
|
|
- debug!("{}: not supported. replacing with TYPEDEF", kind);
|
|
|
- let typedef_type = BtfType::Typedef(Typedef::new(ty.name_offset, ty.btf_type));
|
|
|
- types.types[i] = typedef_type;
|
|
|
- }
|
|
|
- // Sanitize BTF_FUNC_GLOBAL
|
|
|
- BtfType::Func(ty) if !features.btf_func_global => {
|
|
|
- let mut fixed_ty = ty.clone();
|
|
|
- if ty.linkage() == FuncLinkage::Global {
|
|
|
- debug!(
|
|
|
- "{}: BTF_FUNC_GLOBAL not supported. replacing with BTF_FUNC_STATIC",
|
|
|
- kind
|
|
|
- );
|
|
|
- fixed_ty.set_linkage(FuncLinkage::Static);
|
|
|
+ BtfType::Func(ty) => {
|
|
|
+ let name = self.string_at(ty.name_offset)?;
|
|
|
+ // Sanitize FUNC
|
|
|
+ if !features.btf_func {
|
|
|
+ debug!("{}: not supported. replacing with TYPEDEF", kind);
|
|
|
+ let typedef_type =
|
|
|
+ BtfType::Typedef(Typedef::new(ty.name_offset, ty.btf_type));
|
|
|
+ types.types[i] = typedef_type;
|
|
|
+ } else if !features.btf_func_global || name == "memset" || name == "memcpy" {
|
|
|
+ // Sanitize BTF_FUNC_GLOBAL and memset, memcpy
|
|
|
+ let mut fixed_ty = ty.clone();
|
|
|
+ if ty.linkage() == FuncLinkage::Global {
|
|
|
+ debug!(
|
|
|
+ "{}: BTF_FUNC_GLOBAL not supported. replacing with BTF_FUNC_STATIC",
|
|
|
+ kind
|
|
|
+ );
|
|
|
+ fixed_ty.set_linkage(FuncLinkage::Static);
|
|
|
+ }
|
|
|
+ types.types[i] = BtfType::Func(fixed_ty);
|
|
|
}
|
|
|
- types.types[i] = BtfType::Func(fixed_ty);
|
|
|
+
|
|
|
+ // Sanitize BTF_FUNC_GLOBAL and memset, memcpy
|
|
|
+ /*let name = self.string_at(ty.name_offset)?;
|
|
|
+ if !features.btf_func_global || name == "memset" || name == "memcpy" {
|
|
|
+ let mut fixed_ty = ty.clone();
|
|
|
+ if ty.linkage() == FuncLinkage::Global {
|
|
|
+ debug!(
|
|
|
+ "{}: BTF_FUNC_GLOBAL not supported. replacing with BTF_FUNC_STATIC",
|
|
|
+ kind
|
|
|
+ );
|
|
|
+ fixed_ty.set_linkage(FuncLinkage::Static);
|
|
|
+ }
|
|
|
+ types.types[i] = BtfType::Func(fixed_ty);
|
|
|
+ }*/
|
|
|
}
|
|
|
+
|
|
|
// Sanitize FLOAT
|
|
|
BtfType::Float(ty) if !features.btf_float => {
|
|
|
debug!("{}: not supported. replacing with STRUCT", kind);
|
|
@@ -1350,6 +1370,59 @@ mod tests {
|
|
|
Btf::parse(&raw, Endianness::default()).unwrap();
|
|
|
}
|
|
|
|
|
|
+ #[test]
|
|
|
+ fn test_sanitize_memset_memcpy() {
|
|
|
+ let mut btf = Btf::new();
|
|
|
+ let name_offset = btf.add_string("int".to_string());
|
|
|
+ let int_type_id = btf.add_type(BtfType::Int(Int::new(
|
|
|
+ name_offset,
|
|
|
+ 4,
|
|
|
+ IntEncoding::Signed,
|
|
|
+ 0,
|
|
|
+ )));
|
|
|
+
|
|
|
+ let params = vec![
|
|
|
+ BtfParam {
|
|
|
+ name_offset: btf.add_string("a".to_string()),
|
|
|
+ btf_type: int_type_id,
|
|
|
+ },
|
|
|
+ BtfParam {
|
|
|
+ name_offset: btf.add_string("b".to_string()),
|
|
|
+ btf_type: int_type_id,
|
|
|
+ },
|
|
|
+ ];
|
|
|
+ let func_proto_type_id =
|
|
|
+ btf.add_type(BtfType::FuncProto(FuncProto::new(params, int_type_id)));
|
|
|
+
|
|
|
+ ["memset", "memcpy"].iter().for_each(|fname| {
|
|
|
+ let func_name_offset = btf.add_string(fname.to_string());
|
|
|
+ let func_type_id = btf.add_type(BtfType::Func(Func::new(
|
|
|
+ func_name_offset,
|
|
|
+ func_proto_type_id,
|
|
|
+ FuncLinkage::Global,
|
|
|
+ )));
|
|
|
+
|
|
|
+ let features = BtfFeatures {
|
|
|
+ btf_func: true,
|
|
|
+ btf_func_global: true, // to force function name check
|
|
|
+ ..Default::default()
|
|
|
+ };
|
|
|
+
|
|
|
+ btf.fixup_and_sanitize(&HashMap::new(), &HashMap::new(), &features)
|
|
|
+ .unwrap();
|
|
|
+
|
|
|
+ if let BtfType::Func(fixed) = btf.type_by_id(func_type_id).unwrap() {
|
|
|
+ assert!(fixed.linkage() == FuncLinkage::Static);
|
|
|
+ } else {
|
|
|
+ panic!("not a func")
|
|
|
+ }
|
|
|
+
|
|
|
+ // Ensure we can convert to bytes and back again
|
|
|
+ let raw = btf.to_bytes();
|
|
|
+ Btf::parse(&raw, Endianness::default()).unwrap();
|
|
|
+ });
|
|
|
+ }
|
|
|
+
|
|
|
#[test]
|
|
|
fn test_sanitize_float() {
|
|
|
let mut btf = Btf::new();
|