@@ -72,9 +72,7 @@ use super::memory_region::{
7272 MemoryRegionVecBuilder ,
7373} ;
7474use super :: shared_mem:: { ExclusiveSharedMemory , SharedMemory } ;
75- use crate :: error:: HyperlightError :: {
76- GuestOffsetIsInvalid , MemoryRequestTooBig , MemoryRequestTooSmall ,
77- } ;
75+ use crate :: error:: HyperlightError :: { MemoryRequestTooBig , MemoryRequestTooSmall } ;
7876use crate :: sandbox:: SandboxConfiguration ;
7977use crate :: { Result , new_error} ;
8078
@@ -584,68 +582,70 @@ impl SandboxMemoryLayout {
584582 /// Note: `shared_mem` may have been modified, even if `Err` was returned
585583 /// from this function.
586584 #[ instrument( err( Debug ) , skip_all, parent = Span :: current( ) , level= "Trace" ) ]
587- pub ( crate ) fn write (
588- & self ,
589- shared_mem : & mut ExclusiveSharedMemory ,
590- guest_offset : usize ,
591- //TODO: Unused remove
592- _size : usize ,
593- ) -> Result < ( ) > {
585+ pub ( crate ) fn write_peb ( & self , mem : & mut [ u8 ] ) -> Result < ( ) > {
586+ let guest_offset = SandboxMemoryLayout :: BASE_ADDRESS ;
587+
588+ fn write_u64 ( mem : & mut [ u8 ] , offset : usize , value : u64 ) -> Result < ( ) > {
589+ if offset + 8 > mem. len ( ) {
590+ return Err ( new_error ! (
591+ "Cannot write to offset {} in slice of len {}" ,
592+ offset,
593+ mem. len( )
594+ ) ) ;
595+ }
596+ mem[ offset..offset + 8 ] . copy_from_slice ( & u64:: to_ne_bytes ( value) ) ;
597+ Ok ( ( ) )
598+ }
599+
594600 macro_rules! get_address {
595601 ( $something: ident) => {
596602 u64 :: try_from( guest_offset + self . $something) ?
597603 } ;
598604 }
599605
600- if guest_offset != SandboxMemoryLayout :: BASE_ADDRESS
601- && guest_offset != shared_mem. base_addr ( )
602- {
603- return Err ( GuestOffsetIsInvalid ( guest_offset) ) ;
604- }
605-
606606 // Start of setting up the PEB. The following are in the order of the PEB fields
607607
608- // Skip guest_dispatch_function_ptr_offset because it is set by the guest
609-
610- // Skip code, is set when loading binary
611- // skip outb and outb context, is set when running in_proc
612-
613608 // Set up input buffer pointer
614- shared_mem. write_u64 (
609+ write_u64 (
610+ mem,
615611 self . get_input_data_size_offset ( ) ,
616612 self . sandbox_memory_config
617613 . get_input_data_size ( )
618614 . try_into ( ) ?,
619615 ) ?;
620- shared_mem. write_u64 (
616+ write_u64 (
617+ mem,
621618 self . get_input_data_pointer_offset ( ) ,
622619 self . get_input_data_buffer_gva ( ) ,
623620 ) ?;
624621
625622 // Set up output buffer pointer
626- shared_mem. write_u64 (
623+ write_u64 (
624+ mem,
627625 self . get_output_data_size_offset ( ) ,
628626 self . sandbox_memory_config
629627 . get_output_data_size ( )
630628 . try_into ( ) ?,
631629 ) ?;
632- shared_mem. write_u64 (
630+ write_u64 (
631+ mem,
633632 self . get_output_data_pointer_offset ( ) ,
634633 self . get_output_data_buffer_gva ( ) ,
635634 ) ?;
636635
637636 // Set up init data pointer
638- shared_mem. write_u64 (
637+ write_u64 (
638+ mem,
639639 self . get_init_data_size_offset ( ) ,
640640 ( self . get_unaligned_memory_size ( ) - self . init_data_offset ) . try_into ( ) ?,
641641 ) ?;
642642 let addr = get_address ! ( init_data_offset) ;
643- shared_mem . write_u64 ( self . get_init_data_pointer_offset ( ) , addr) ?;
643+ write_u64 ( mem , self . get_init_data_pointer_offset ( ) , addr) ?;
644644
645645 // Set up heap buffer pointer
646646 let addr = get_address ! ( guest_heap_buffer_offset) ;
647- shared_mem . write_u64 ( self . get_heap_size_offset ( ) , self . heap_size . try_into ( ) ?) ?;
648- shared_mem . write_u64 ( self . get_heap_pointer_offset ( ) , addr) ?;
647+ write_u64 ( mem , self . get_heap_size_offset ( ) , self . heap_size . try_into ( ) ?) ?;
648+ write_u64 ( mem , self . get_heap_pointer_offset ( ) , addr) ?;
649649
650650 // Set up the file_mappings descriptor in the PEB.
651651 // - The `size` field holds the number of valid FileMappingInfo
0 commit comments