Fix brk() handling for snapshot module (#2970)
* drop grown address * this clippy lint literally makes 0 sense! * i hate you rust * mm * don't use drop! add comments for why alignment is not necessary
This commit is contained in:
parent
bdcc0c56e4
commit
33db263260
@ -162,6 +162,7 @@ module_name_repetitions = "allow"
|
||||
unsafe_derive_deserialize = "allow"
|
||||
similar_names = "allow"
|
||||
too_many_lines = "allow"
|
||||
comparison_chain = "allow" # This lint makes **ZERO** sense
|
||||
|
||||
|
||||
[workspace.lints.rustdoc]
|
||||
|
@ -407,11 +407,20 @@ impl SnapshotModule {
|
||||
let aligned_new_brk = (new_brk + ((SNAPSHOT_PAGE_SIZE - 1) as GuestAddr))
|
||||
& (!(SNAPSHOT_PAGE_SIZE - 1) as GuestAddr);
|
||||
log::debug!("New brk ({:#x?}) < snapshotted brk ({:#x?})! Mapping back in the target {:#x?} - {:#x?}", new_brk, self.brk, aligned_new_brk, aligned_new_brk + (self.brk - aligned_new_brk));
|
||||
drop(qemu.map_fixed(
|
||||
qemu.map_fixed(
|
||||
aligned_new_brk,
|
||||
(self.brk - aligned_new_brk) as usize,
|
||||
MmapPerms::ReadWrite,
|
||||
));
|
||||
)
|
||||
.unwrap();
|
||||
} else if new_brk > self.brk {
|
||||
// The heap has grown. so we want to drop those
|
||||
let drop_sz = (new_brk - self.brk) as usize;
|
||||
|
||||
// if self.brk is not aligned this call will return an error
|
||||
// and it will page align this drop_sz too
|
||||
// look at target_munmap in qemu-libafl-bridge
|
||||
qemu.unmap(self.brk, drop_sz).unwrap();
|
||||
}
|
||||
|
||||
for acc in &mut self.accesses {
|
||||
@ -426,11 +435,12 @@ impl SnapshotModule {
|
||||
.query_mut(*page..(page + SNAPSHOT_PAGE_SIZE as GuestAddr))
|
||||
{
|
||||
if !entry.value.perms.unwrap_or(MmapPerms::None).writable() {
|
||||
drop(qemu.mprotect(
|
||||
qemu.mprotect(
|
||||
entry.interval.start,
|
||||
(entry.interval.end - entry.interval.start) as usize,
|
||||
MmapPerms::ReadWrite,
|
||||
));
|
||||
)
|
||||
.unwrap();
|
||||
entry.value.changed = true;
|
||||
entry.value.perms = Some(MmapPerms::ReadWrite);
|
||||
}
|
||||
@ -464,11 +474,12 @@ impl SnapshotModule {
|
||||
if !entry.value.perms.unwrap_or(MmapPerms::None).writable()
|
||||
&& !entry.value.changed
|
||||
{
|
||||
drop(qemu.mprotect(
|
||||
qemu.mprotect(
|
||||
entry.interval.start,
|
||||
(entry.interval.end - entry.interval.start) as usize,
|
||||
MmapPerms::ReadWrite,
|
||||
));
|
||||
)
|
||||
.unwrap();
|
||||
entry.value.changed = true;
|
||||
}
|
||||
}
|
||||
@ -487,11 +498,12 @@ impl SnapshotModule {
|
||||
|
||||
for entry in self.maps.tree.query_mut(0..GuestAddr::MAX) {
|
||||
if entry.value.changed {
|
||||
drop(qemu.mprotect(
|
||||
qemu.mprotect(
|
||||
entry.interval.start,
|
||||
(entry.interval.end - entry.interval.start) as usize,
|
||||
entry.value.perms.unwrap(),
|
||||
));
|
||||
)
|
||||
.unwrap();
|
||||
entry.value.changed = false;
|
||||
}
|
||||
}
|
||||
@ -653,26 +665,29 @@ impl SnapshotModule {
|
||||
|
||||
if found.is_empty() {
|
||||
//panic!("A pre-snapshot memory region was unmapped");
|
||||
drop(qemu.map_fixed(
|
||||
qemu.map_fixed(
|
||||
entry.interval.start,
|
||||
(entry.interval.end - entry.interval.start) as usize,
|
||||
entry.value.perms.unwrap(),
|
||||
));
|
||||
)
|
||||
.unwrap();
|
||||
} else if found.len() == 1 && found[0].0 == *entry.interval {
|
||||
if found[0].1 && found[0].2 != entry.value.perms {
|
||||
drop(qemu.mprotect(
|
||||
qemu.mprotect(
|
||||
entry.interval.start,
|
||||
(entry.interval.end - entry.interval.start) as usize,
|
||||
entry.value.perms.unwrap(),
|
||||
));
|
||||
)
|
||||
.unwrap();
|
||||
}
|
||||
} else {
|
||||
// TODO check for holes
|
||||
drop(qemu.mprotect(
|
||||
qemu.mprotect(
|
||||
entry.interval.start,
|
||||
(entry.interval.end - entry.interval.start) as usize,
|
||||
entry.value.perms.unwrap(),
|
||||
));
|
||||
)
|
||||
.unwrap();
|
||||
}
|
||||
|
||||
for (interval, ..) in found {
|
||||
@ -685,7 +700,7 @@ impl SnapshotModule {
|
||||
to_unmap.push((*entry.interval, entry.value.changed, entry.value.perms));
|
||||
}
|
||||
for (i, ..) in to_unmap {
|
||||
drop(qemu.unmap(i.start, (i.end - i.start) as usize));
|
||||
qemu.unmap(i.start, (i.end - i.start) as usize).unwrap();
|
||||
new_maps.tree.delete(i);
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user