Fix panic when build process VM failed
This commit is contained in:
parent
1dc2b517fc
commit
0b824d3a98
@ -118,13 +118,24 @@ impl<'a, 'b> ProcessVMBuilder<'a, 'b> {
|
|||||||
.align(elf_layout.align())
|
.align(elf_layout.align())
|
||||||
.perms(VMPerms::ALL) // set it to read | write | exec for simplicity
|
.perms(VMPerms::ALL) // set it to read | write | exec for simplicity
|
||||||
.initializer(VMInitializer::DoNothing())
|
.initializer(VMInitializer::DoNothing())
|
||||||
.build()?;
|
.build()
|
||||||
let (elf_range, chunk_ref) = USER_SPACE_VM_MANAGER.alloc(&vm_option)?;
|
.map_err(|e| {
|
||||||
|
&self.handle_error_when_init(&chunks);
|
||||||
|
e
|
||||||
|
})?;
|
||||||
|
let (elf_range, chunk_ref) =
|
||||||
|
USER_SPACE_VM_MANAGER.alloc(&vm_option).map_err(|e| {
|
||||||
|
&self.handle_error_when_init(&chunks);
|
||||||
|
e
|
||||||
|
})?;
|
||||||
debug_assert!(elf_range.start() % elf_layout.align() == 0);
|
debug_assert!(elf_range.start() % elf_layout.align() == 0);
|
||||||
Self::init_elf_memory(&elf_range, elf_file)?;
|
chunks.insert(chunk_ref);
|
||||||
|
Self::init_elf_memory(&elf_range, elf_file).map_err(|e| {
|
||||||
|
&self.handle_error_when_init(&chunks);
|
||||||
|
e
|
||||||
|
})?;
|
||||||
trace!("elf range = {:?}", elf_range);
|
trace!("elf range = {:?}", elf_range);
|
||||||
elf_ranges.push(elf_range);
|
elf_ranges.push(elf_range);
|
||||||
chunks.insert(chunk_ref);
|
|
||||||
Ok(())
|
Ok(())
|
||||||
})
|
})
|
||||||
.collect::<Result<()>>()?;
|
.collect::<Result<()>>()?;
|
||||||
@ -135,8 +146,16 @@ impl<'a, 'b> ProcessVMBuilder<'a, 'b> {
|
|||||||
.size(heap_layout.size())
|
.size(heap_layout.size())
|
||||||
.align(heap_layout.align())
|
.align(heap_layout.align())
|
||||||
.perms(VMPerms::READ | VMPerms::WRITE)
|
.perms(VMPerms::READ | VMPerms::WRITE)
|
||||||
.build()?;
|
.build()
|
||||||
let (heap_range, chunk_ref) = USER_SPACE_VM_MANAGER.alloc(&vm_option)?;
|
.map_err(|e| {
|
||||||
|
&self.handle_error_when_init(&chunks);
|
||||||
|
e
|
||||||
|
})?;
|
||||||
|
|
||||||
|
let (heap_range, chunk_ref) = USER_SPACE_VM_MANAGER.alloc(&vm_option).map_err(|e| {
|
||||||
|
&self.handle_error_when_init(&chunks);
|
||||||
|
e
|
||||||
|
})?;
|
||||||
debug_assert!(heap_range.start() % heap_layout.align() == 0);
|
debug_assert!(heap_range.start() % heap_layout.align() == 0);
|
||||||
trace!("heap range = {:?}", heap_range);
|
trace!("heap range = {:?}", heap_range);
|
||||||
let brk = AtomicUsize::new(heap_range.start());
|
let brk = AtomicUsize::new(heap_range.start());
|
||||||
@ -148,8 +167,15 @@ impl<'a, 'b> ProcessVMBuilder<'a, 'b> {
|
|||||||
.size(stack_layout.size())
|
.size(stack_layout.size())
|
||||||
.align(heap_layout.align())
|
.align(heap_layout.align())
|
||||||
.perms(VMPerms::READ | VMPerms::WRITE)
|
.perms(VMPerms::READ | VMPerms::WRITE)
|
||||||
.build()?;
|
.build()
|
||||||
let (stack_range, chunk_ref) = USER_SPACE_VM_MANAGER.alloc(&vm_option)?;
|
.map_err(|e| {
|
||||||
|
&self.handle_error_when_init(&chunks);
|
||||||
|
e
|
||||||
|
})?;
|
||||||
|
let (stack_range, chunk_ref) = USER_SPACE_VM_MANAGER.alloc(&vm_option).map_err(|e| {
|
||||||
|
&self.handle_error_when_init(&chunks);
|
||||||
|
e
|
||||||
|
})?;
|
||||||
debug_assert!(stack_range.start() % stack_layout.align() == 0);
|
debug_assert!(stack_range.start() % stack_layout.align() == 0);
|
||||||
chunks.insert(chunk_ref);
|
chunks.insert(chunk_ref);
|
||||||
trace!("stack range = {:?}", stack_range);
|
trace!("stack range = {:?}", stack_range);
|
||||||
@ -179,6 +205,12 @@ impl<'a, 'b> ProcessVMBuilder<'a, 'b> {
|
|||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn handle_error_when_init(&self, chunks: &HashSet<Arc<Chunk>>) {
|
||||||
|
chunks.iter().for_each(|chunk| {
|
||||||
|
USER_SPACE_VM_MANAGER.internal().munmap_chunk(chunk, None);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
fn init_elf_memory(elf_range: &VMRange, elf_file: &ElfFile) -> Result<()> {
|
fn init_elf_memory(elf_range: &VMRange, elf_file: &ElfFile) -> Result<()> {
|
||||||
// Destination buffer: ELF appeared in the process
|
// Destination buffer: ELF appeared in the process
|
||||||
let elf_proc_buf = unsafe { elf_range.as_slice_mut() };
|
let elf_proc_buf = unsafe { elf_range.as_slice_mut() };
|
||||||
|
Loading…
Reference in New Issue
Block a user