diff --git a/aya-obj/src/btf/btf.rs b/aya-obj/src/btf/btf.rs index 965a141a..254a616a 100644 --- a/aya-obj/src/btf/btf.rs +++ b/aya-obj/src/btf/btf.rs @@ -694,11 +694,18 @@ impl BtfExt { let minimal_header = ptr::read_unaligned::(data.as_ptr() as *const MinimalHeader); + let len_to_read = minimal_header.hdr_len as usize; + // prevent invalid input from causing UB - if data.len() < minimal_header.hdr_len as usize { + if data.len() < len_to_read { return Err(BtfError::InvalidHeader); } + // forwards compatibility: if newer headers are bigger + // than the pre-generated btf_ext_header we should only + // read up to btf_ext_header + let len_to_read = len_to_read.min(std::mem::size_of::()); + // now create our full-fledge header; but start with it // zeroed out so unavailable fields stay as zero on older // BTF.ext sections @@ -708,9 +715,9 @@ impl BtfExt { // hdr_len bytes let header_as_slice: &mut [u8] = std::slice::from_raw_parts_mut( &mut header as *mut btf_ext_header as *mut u8, - minimal_header.hdr_len as usize, + len_to_read, ); - header_as_slice.copy_from_slice(&data[0..minimal_header.hdr_len as usize]); + header_as_slice.copy_from_slice(&data[0..len_to_read]); header };