@@ -22,6 +22,7 @@ use std::mem::{align_of, size_of};
2222use std:: ptr:: null_mut;
2323use std:: sync:: { Arc , RwLock } ;
2424
25+ use hyperlight_common:: flatbuffer_wrappers:: util:: { Deserialize , decode} ;
2526use hyperlight_common:: mem:: PAGE_SIZE_USIZE ;
2627use tracing:: { Span , instrument} ;
2728#[ cfg( target_os = "windows" ) ]
@@ -1130,17 +1131,11 @@ impl HostSharedMemory {
11301131 Ok ( ( ) )
11311132 }
11321133
1133- /// Pops the given given buffer into a `T` and returns it.
1134- /// NOTE! the data must be a size-prefixed flatbuffer, and
1135- /// buffer_start_offset must point to the beginning of the buffer
1136- pub fn try_pop_buffer_into < T > (
1134+ fn try_pop_buffer_raw (
11371135 & mut self ,
11381136 buffer_start_offset : usize ,
11391137 buffer_size : usize ,
1140- ) -> Result < T >
1141- where
1142- T : for < ' b > TryFrom < & ' b [ u8 ] > ,
1143- {
1138+ ) -> Result < Vec < u8 > > {
11441139 // get the stackpointer
11451140 let stack_pointer_rel = self . read :: < u64 > ( buffer_start_offset) ? as usize ;
11461141
@@ -1180,17 +1175,15 @@ impl HostSharedMemory {
11801175
11811176 // Get the size of the flatbuffer buffer from memory
11821177 let fb_buffer_size = {
1183- let raw_prefix = self . read :: < u32 > ( last_element_offset_abs) ?;
1184- // flatbuffer byte arrays are prefixed by 4 bytes indicating
1185- // the remaining size; add 4 for the prefix itself.
1186- let total = raw_prefix. checked_add ( 4 ) . ok_or_else ( || {
1187- new_error ! (
1188- "Corrupt buffer size prefix: value {} overflows when adding 4-byte header." ,
1189- raw_prefix
1190- )
1191- } ) ?;
1192- usize:: try_from ( total)
1193- } ?;
1178+ stack_pointer_rel - last_element_offset_rel - 8
1179+ /*
1180+ let size_i32 = self.read::<u32>(last_element_offset_abs)? + 4;
1181+ // ^^^ flatbuffer byte arrays are prefixed by 4 bytes
1182+ // indicating its size, so, to get the actual size, we need
1183+ // to add 4.
1184+ usize::try_from(size_i32)
1185+ */
1186+ } ;
11941187
11951188 if fb_buffer_size > max_element_size {
11961189 return Err ( new_error ! (
@@ -1203,12 +1196,6 @@ impl HostSharedMemory {
12031196 let mut result_buffer = vec ! [ 0 ; fb_buffer_size] ;
12041197
12051198 self . copy_to_slice ( & mut result_buffer, last_element_offset_abs) ?;
1206- let to_return = T :: try_from ( result_buffer. as_slice ( ) ) . map_err ( |_e| {
1207- new_error ! (
1208- "pop_buffer_into: failed to convert buffer to {}" ,
1209- type_name:: <T >( )
1210- )
1211- } ) ?;
12121199
12131200 // update the stack pointer to point to the element we just popped off since that is now free
12141201 self . write :: < u64 > ( buffer_start_offset, last_element_offset_rel as u64 ) ?;
@@ -1217,6 +1204,27 @@ impl HostSharedMemory {
12171204 let num_bytes_to_zero = stack_pointer_rel - last_element_offset_rel;
12181205 self . fill ( 0 , last_element_offset_abs, num_bytes_to_zero) ?;
12191206
1207+ Ok ( result_buffer)
1208+ }
1209+
1210+ /// Pops the given given buffer into a `T` and returns it.
1211+ /// NOTE! the data must be a size-prefixed flatbuffer, and
1212+ /// buffer_start_offset must point to the beginning of the buffer
1213+ pub fn try_pop_buffer_into < T > (
1214+ & mut self ,
1215+ buffer_start_offset : usize ,
1216+ buffer_size : usize ,
1217+ ) -> Result < T >
1218+ where
1219+ T : for < ' b > Deserialize < ' b > ,
1220+ {
1221+ let result_buffer = self . try_pop_buffer_raw ( buffer_start_offset, buffer_size) ?;
1222+ let to_return: T = decode ( result_buffer. as_slice ( ) ) . map_err ( |_e| {
1223+ new_error ! (
1224+ "pop_buffer_into: failed to convert buffer to {}" ,
1225+ type_name:: <T >( )
1226+ )
1227+ } ) ?;
12201228 Ok ( to_return)
12211229 }
12221230}
@@ -1730,16 +1738,6 @@ mod tests {
17301738 mod try_pop_buffer_bounds {
17311739 use super :: * ;
17321740
1733- #[ derive( Debug , PartialEq ) ]
1734- struct RawBytes ( Vec < u8 > ) ;
1735-
1736- impl TryFrom < & [ u8 ] > for RawBytes {
1737- type Error = String ;
1738- fn try_from ( value : & [ u8 ] ) -> std:: result:: Result < Self , Self :: Error > {
1739- Ok ( RawBytes ( value. to_vec ( ) ) )
1740- }
1741- }
1742-
17431741 /// Create a buffer with stack pointer initialized to 8 (empty).
17441742 fn make_buffer ( mem_size : usize ) -> super :: super :: HostSharedMemory {
17451743 let eshm = ExclusiveSharedMemory :: new ( mem_size) . unwrap ( ) ;
@@ -1760,8 +1758,8 @@ mod tests {
17601758 data. extend_from_slice ( payload) ;
17611759
17621760 hshm. push_buffer ( 0 , mem_size, & data) . unwrap ( ) ;
1763- let result: RawBytes = hshm. try_pop_buffer_into ( 0 , mem_size) . unwrap ( ) ;
1764- assert_eq ! ( result. 0 , data) ;
1761+ let result = hshm. try_pop_buffer_raw ( 0 , mem_size) . unwrap ( ) ;
1762+ assert_eq ! ( result, data) ;
17651763 }
17661764
17671765 #[ test]
@@ -1778,7 +1776,7 @@ mod tests {
17781776 // Corrupt size prefix at element start (offset 8) to near u32::MAX.
17791777 hshm. write :: < u32 > ( 8 , 0xFFFF_FFFBu32 ) . unwrap ( ) ; // +4 = 0xFFFF_FFFF
17801778
1781- let result: Result < RawBytes > = hshm. try_pop_buffer_into ( 0 , mem_size) ;
1779+ let result = hshm. try_pop_buffer_raw ( 0 , mem_size) ;
17821780 let err_msg = format ! ( "{}" , result. unwrap_err( ) ) ;
17831781 assert ! (
17841782 err_msg. contains( "Corrupt buffer size prefix: flatbuffer claims 4294967295 bytes but the element slot is only 9 bytes" ) ,
@@ -1801,7 +1799,7 @@ mod tests {
18011799 // Corrupt back-pointer (offset 16) to 0 (before valid range).
18021800 hshm. write :: < u64 > ( 16 , 0u64 ) . unwrap ( ) ;
18031801
1804- let result: Result < RawBytes > = hshm. try_pop_buffer_into ( 0 , mem_size) ;
1802+ let result = hshm. try_pop_buffer_raw ( 0 , mem_size) ;
18051803 let err_msg = format ! ( "{}" , result. unwrap_err( ) ) ;
18061804 assert ! (
18071805 err_msg. contains(
@@ -1826,7 +1824,7 @@ mod tests {
18261824 // Corrupt back-pointer (offset 16) to 9999 (past stack pointer 24).
18271825 hshm. write :: < u64 > ( 16 , 9999u64 ) . unwrap ( ) ;
18281826
1829- let result: Result < RawBytes > = hshm. try_pop_buffer_into ( 0 , mem_size) ;
1827+ let result = hshm. try_pop_buffer_raw ( 0 , mem_size) ;
18301828 let err_msg = format ! ( "{}" , result. unwrap_err( ) ) ;
18311829 assert ! (
18321830 err_msg. contains(
@@ -1851,7 +1849,7 @@ mod tests {
18511849 // Corrupt size prefix: claim 5 bytes (total 9), exceeding the 8-byte slot.
18521850 hshm. write :: < u32 > ( 8 , 5u32 ) . unwrap ( ) ; // fb_buffer_size = 5 + 4 = 9
18531851
1854- let result: Result < RawBytes > = hshm. try_pop_buffer_into ( 0 , mem_size) ;
1852+ let result = hshm. try_pop_buffer_raw ( 0 , mem_size) ;
18551853 let err_msg = format ! ( "{}" , result. unwrap_err( ) ) ;
18561854 assert ! (
18571855 err_msg. contains( "Corrupt buffer size prefix: flatbuffer claims 9 bytes but the element slot is only 8 bytes" ) ,
@@ -1876,7 +1874,7 @@ mod tests {
18761874 // stack_pointer_rel = 24. Set back-pointer to 23 (> 24 - 16 = 8, so rejected).
18771875 hshm. write :: < u64 > ( 16 , 23u64 ) . unwrap ( ) ;
18781876
1879- let result: Result < RawBytes > = hshm. try_pop_buffer_into ( 0 , mem_size) ;
1877+ let result = hshm. try_pop_buffer_raw ( 0 , mem_size) ;
18801878 let err_msg = format ! ( "{}" , result. unwrap_err( ) ) ;
18811879 assert ! (
18821880 err_msg. contains(
@@ -1902,7 +1900,7 @@ mod tests {
19021900 // Write 0xFFFF_FFFD as size prefix: checked_add(4) returns None.
19031901 hshm. write :: < u32 > ( 8 , 0xFFFF_FFFDu32 ) . unwrap ( ) ;
19041902
1905- let result: Result < RawBytes > = hshm. try_pop_buffer_into ( 0 , mem_size) ;
1903+ let result = hshm. try_pop_buffer_raw ( 0 , mem_size) ;
19061904 let err_msg = format ! ( "{}" , result. unwrap_err( ) ) ;
19071905 assert ! (
19081906 err_msg. contains( "Corrupt buffer size prefix: value 4294967293 overflows when adding 4-byte header" ) ,
0 commit comments