@@ -427,8 +427,13 @@ impl OsIpcSender {
427427 // Zero out the last word for paranoia's sake.
428428 * ( ( message as * mut u8 ) . offset ( size as isize - 4 ) as * mut u32 ) = 0 ;
429429
430- let data_dest = shared_memory_descriptor_dest as * mut u8 ;
431- ptr:: copy_nonoverlapping ( data. as_ptr ( ) , data_dest, data. len ( ) ) ;
430+ let mut data_dest = shared_memory_descriptor_dest as * mut u8 ;
431+ let data_size = data. len ( ) ;
432+ let data_size_dest = data_dest as * mut usize ;
433+ * data_size_dest = data_size;
434+
435+ data_dest = data_dest. offset ( mem:: size_of :: < usize > ( ) as isize ) ;
436+ ptr:: copy_nonoverlapping ( data. as_ptr ( ) , data_dest, data_size) ;
432437
433438 let mut ptr = message as * const u32 ;
434439 let end = ( message as * const u8 ) . offset ( size as isize ) as * const u32 ;
@@ -637,9 +642,12 @@ fn select(port: mach_port_t, blocking_mode: BlockingMode)
637642 descriptors_remaining -= 1 ;
638643 }
639644
640- let payload_ptr = shared_memory_descriptor as * mut u8 ;
641- let payload_size = message as usize + ( ( * message) . header . msgh_size as usize ) -
645+ let mut payload_ptr = shared_memory_descriptor as * mut u8 ;
646+ let payload_size = * ( payload_ptr as * mut usize ) ;
647+ let max_payload_size = message as usize + ( ( * message) . header . msgh_size as usize ) -
642648 ( shared_memory_descriptor as usize ) ;
649+ assert ! ( payload_size <= max_payload_size) ;
650+ payload_ptr = payload_ptr. offset ( mem:: size_of :: < usize > ( ) as isize ) ;
643651 let payload = slice:: from_raw_parts ( payload_ptr, payload_size) . to_vec ( ) ;
644652
645653 if let Some ( allocated_buffer) = allocated_buffer {
@@ -809,9 +817,9 @@ impl Message {
809817 let mut size = mem:: size_of :: < Message > ( ) +
810818 mem:: size_of :: < mach_msg_port_descriptor_t > ( ) * port_length +
811819 mem:: size_of :: < mach_msg_ool_descriptor_t > ( ) * shared_memory_length +
812- data_length;
820+ mem :: size_of :: < usize > ( ) + data_length;
813821
814- // Round up to the next 4 bytes.
822+ // Round up to the next 4 bytes; mach_msg_send returns an error for unaligned sizes .
815823 if ( size & 0x3 ) != 0 {
816824 size = ( size & !0x3 ) + 4 ;
817825 }
0 commit comments