use libafl_bolts::{
AsSlice, AsSliceMut,
shmem::{ShMemDescription, ShMemProvider, UnixShMem, UnixShMemProvider},
};
use std::alloc::{Layout, alloc};
unsafe extern "C" {
pub fn has_new_bits(virgin_map: *mut u8, shm_map: *mut u8, map_size: u32) -> u8;
}
#[inline]
pub fn get_layout(size: usize, align: usize) -> *mut u8 {
let layout = Layout::from_size_align(size, align).unwrap();
let layout = unsafe { alloc(layout) as *mut u8 };
if layout.is_null() {
panic!("Failed to alloc layout");
}
layout
}
#[inline]
pub fn read_from_mem<T>(shm: &UnixShMem, offset: usize) -> T
where
T: Copy,
{
let slice = shm.as_slice();
unsafe { *(slice.as_ptr().add(offset) as *const T) }
}
#[inline]
pub fn write_to_mem<T>(shm: &mut UnixShMem, value: T, offset: usize)
where
T: Copy,
{
let slice = shm.as_slice_mut();
unsafe {
*(slice.as_mut_ptr().add(offset) as *mut T) = value;
}
}
#[inline]
pub fn read_from_ptr<T>(ptr: *const u8, offset: usize) -> T
where
T: Copy,
{
unsafe { *(ptr.add(offset) as *const T) }
}
#[inline]
pub fn write_to_ptr<T>(ptr: *mut u8, offset: usize, value: T)
where
T: Copy,
{
unsafe {
*(ptr.add(offset) as *mut T) = value;
}
}
pub fn show_shm_mem_layout(id_str: &str, size: usize) {
let mut shm_provider = UnixShMemProvider::new().unwrap();
let mut shmem = shm_provider
.shmem_from_description(ShMemDescription::from_string_and_size(id_str, size))
.unwrap();
let shmem_ptr = shmem.as_slice_mut().as_mut_ptr();
show_shm_ptr_layout(shmem_ptr, size);
}
pub fn show_shm_ptr_layout(ptr: *mut u8, size: usize) {
println!("shm_addr: {:p}", ptr);
println!("Memory contents (showing {} bytes):", size);
for i in 0..size {
unsafe {
print!("{:02x} ", *ptr.add(i));
if (i + 1) % 8 == 0 {
print!(" ");
for j in (i - 7)..=i {
let c = *ptr.add(j);
print!("{}", if c >= 32 && c <= 126 { c as char } else { '.' });
}
println!();
}
}
}
if size % 8 != 0 {
let padding = (8 - (size % 8)) * 3;
for _ in 0..padding {
print!(" ");
}
print!(" ");
let start = size - (size % 8);
for j in start..size {
unsafe {
let c = *ptr.add(j);
print!("{}", if c >= 32 && c <= 126 { c as char } else { '.' });
}
}
println!();
}
}