Skip to content

Commit 33bc6e6

Browse files
committed
Include actual data length in mach message to account for 4 byte alignment.
1 parent ad534b7 commit 33bc6e6

File tree

1 file changed

+14
-6
lines changed

1 file changed

+14
-6
lines changed

src/platform/macos/mod.rs

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)