Преглед изворни кода

btf: fix borrow check errors

Alessandro Decina пре 3 година
родитељ
комит
4efc2061a8
1 измењених фајлова са 12 додато и 8 уклоњено
  1. 12 8
      aya/src/obj/btf/btf.rs

+ 12 - 8
aya/src/obj/btf/btf.rs

@@ -454,7 +454,7 @@ impl Btf {
                 }
                 // Fixup DATASEC
                 BtfKind::DataSec if features.btf_datasec => {
-                    if let Some(BtfType::DataSec(ty, data)) = types.types.get_mut(i) {
+                    if let Some(BtfType::DataSec(ty, data)) = types.types.get(i) {
                         // Start DataSec Fixups
                         let sec_name = self.string_at(ty.name_off)?;
                         let name = sec_name.to_string();
@@ -465,22 +465,25 @@ impl Btf {
                             continue;
                         }
 
+                        let mut fixed_ty = *ty;
+                        let mut fixed_data = data.clone();
                         // We need to get the size of the section from the ELF file
                         // Fortunately, we cached these when parsing it initially
                         // and we can this up by name in section_sizes
-                        if let Some(size) = section_sizes.get(&name) {
-                            debug!("{} {}: fixup size to {}", kind, name, size);
-                            ty.__bindgen_anon_1.size = *size as u32;
-                        } else {
-                            return Err(BtfError::UnknownSectionSize { section_name: name });
-                        }
+                        let size = section_sizes.get(&name).ok_or_else(|| {
+                            BtfError::UnknownSectionSize {
+                                section_name: name.clone(),
+                            }
+                        })?;
+                        debug!("{} {}: fixup size to {}", kind, name, size);
+                        fixed_ty.__bindgen_anon_1.size = *size as u32;
 
                         // The Vec<btf_var_secinfo> contains BTF_KIND_VAR sections
                         // that need to have their offsets adjusted. To do this,
                         // we need to get the offset from the ELF file.
                         // This was also cached during initial parsing and
                         // we can query by name in symbol_offsets
-                        for d in data {
+                        for d in &mut fixed_data {
                             let var_type = types.type_by_id(d.type_)?;
                             let var_kind = var_type.kind()?.unwrap();
                             if let BtfType::Var(vty, var) = var_type {
@@ -507,6 +510,7 @@ impl Btf {
                                 return Err(BtfError::InvalidDatasec);
                             }
                         }
+                        types.types[i] = BtfType::DataSec(fixed_ty, fixed_data);
                     }
                 }
                 // Fixup FUNC_PROTO