From 540ed3d170ef97f9fc26bd3fbfdbc4f265e96034 Mon Sep 17 00:00:00 2001 From: Ian Douglas Scott Date: Fri, 11 Oct 2024 12:00:47 -0700 Subject: [PATCH] Use `to_ne_bytes()` instead of unsound `Vec::from_raw_parts` `from_raw_parts()` is only sound if the alignment is the same, so it can't be used to covert to a `Vec` from a type with a greater alignment. This isn't hard to avoid, luckily. --- src/wayland/protocols/screencopy.rs | 36 +++++-------- src/wayland/protocols/toplevel_info.rs | 12 ++--- src/wayland/protocols/toplevel_management.rs | 16 +++--- src/wayland/protocols/workspace.rs | 57 +++++++------------- 4 files changed, 43 insertions(+), 78 deletions(-) diff --git a/src/wayland/protocols/screencopy.rs b/src/wayland/protocols/screencopy.rs index 5345c8e7..02fdc213 100644 --- a/src/wayland/protocols/screencopy.rs +++ b/src/wayland/protocols/screencopy.rs @@ -139,14 +139,10 @@ impl Session { let node = Vec::from(dma.node.dev_id().to_ne_bytes()); self.obj.dmabuf_device(node); for (fmt, modifiers) in &dma.formats { - let mut modifiers = modifiers.clone(); - let modifiers: Vec = { - let ptr = modifiers.as_mut_ptr() as *mut u8; - let len = modifiers.len() * 4; - let cap = modifiers.capacity() * 4; - std::mem::forget(modifiers); - unsafe { Vec::from_raw_parts(ptr, len, cap) } - }; + let modifiers = modifiers + .iter() + .flat_map(|modifier| u64::from(*modifier).to_ne_bytes()) + .collect::>(); self.obj.dmabuf_format(*fmt as u32, modifiers); } } @@ -249,14 +245,10 @@ impl CursorSession { let node = Vec::from(dma.node.dev_id().to_ne_bytes()); session_obj.dmabuf_device(node); for (fmt, modifiers) in &dma.formats { - let mut modifiers = modifiers.clone(); - let modifiers: Vec = { - let ptr = modifiers.as_mut_ptr() as *mut u8; - let len = modifiers.len() * 4; - let cap = modifiers.capacity() * 4; - std::mem::forget(modifiers); - unsafe { Vec::from_raw_parts(ptr, len, cap) } - }; + let modifiers = modifiers + .iter() + .flat_map(|modifier| u64::from(*modifier).to_ne_bytes()) + .collect::>(); session_obj.dmabuf_format(*fmt as u32, modifiers); } } @@ -747,14 +739,10 @@ where let node = Vec::from(dma.node.dev_id().to_ne_bytes()); session.dmabuf_device(node); for (fmt, modifiers) in &dma.formats { - let mut modifiers = modifiers.clone(); - let modifiers: Vec = { - let ptr = modifiers.as_mut_ptr() as *mut u8; - let len = modifiers.len() * 4; - let cap = modifiers.capacity() * 4; - std::mem::forget(modifiers); - unsafe { Vec::from_raw_parts(ptr, len, cap) } - }; + let modifiers = modifiers + .iter() + .flat_map(|modifier| u64::from(*modifier).to_ne_bytes()) + .collect::>(); session.dmabuf_format(*fmt as u32, modifiers); } } diff --git a/src/wayland/protocols/toplevel_info.rs b/src/wayland/protocols/toplevel_info.rs index 9eb680b1..48b9e483 100644 --- a/src/wayland/protocols/toplevel_info.rs +++ b/src/wayland/protocols/toplevel_info.rs @@ -509,14 +509,10 @@ where } handle_state.states = states.clone(); - let states: Vec = { - let ratio = std::mem::size_of::() / std::mem::size_of::(); - let ptr = states.as_mut_ptr() as *mut u8; - let len = states.len() * ratio; - let cap = states.capacity() * ratio; - std::mem::forget(states); - unsafe { Vec::from_raw_parts(ptr, len, cap) } - }; + let states = states + .iter() + .flat_map(|state| (*state as u32).to_ne_bytes()) + .collect::>(); instance.state(states); changed = true; } diff --git a/src/wayland/protocols/toplevel_management.rs b/src/wayland/protocols/toplevel_management.rs index efd8d325..6755334c 100644 --- a/src/wayland/protocols/toplevel_management.rs +++ b/src/wayland/protocols/toplevel_management.rs @@ -151,15 +151,13 @@ where data_init: &mut DataInit<'_, D>, ) { let instance = data_init.init(resource, ()); - let capabilities = { - let mut caps = state.toplevel_management_state().capabilities.clone(); - let ratio = std::mem::size_of::() / std::mem::size_of::(); - let ptr = caps.as_mut_ptr() as *mut u8; - let len = caps.len() * ratio; - let cap = caps.capacity() * ratio; - std::mem::forget(caps); - unsafe { Vec::from_raw_parts(ptr, len, cap) } - }; + let capabilities = state + .toplevel_management_state() + .capabilities + .iter() + .flat_map(|cap| (*cap as u32).to_ne_bytes()) + .collect::>(); + instance.capabilities(capabilities); state.toplevel_management_state().instances.push(instance); } diff --git a/src/wayland/protocols/workspace.rs b/src/wayland/protocols/workspace.rs index 60b1380c..6d661ad7 100644 --- a/src/wayland/protocols/workspace.rs +++ b/src/wayland/protocols/workspace.rs @@ -929,15 +929,11 @@ where } if handle_state.capabilities != group.capabilities { - let caps: Vec = { - let mut caps = group.capabilities.clone(); - let ratio = std::mem::size_of::() / std::mem::size_of::(); - let ptr = caps.as_mut_ptr() as *mut u8; - let len = caps.len() * ratio; - let cap = caps.capacity() * ratio; - std::mem::forget(caps); - unsafe { Vec::from_raw_parts(ptr, len, cap) } - }; + let caps = group + .capabilities + .iter() + .flat_map(|cap| (*cap as u32).to_ne_bytes()) + .collect::>(); instance.capabilities(caps); handle_state.capabilities = group.capabilities.clone(); changed = true; @@ -1005,44 +1001,31 @@ where changed = true; } if handle_state.coordinates != workspace.coordinates { - let coords: Vec = { - let mut coords = workspace.coordinates.clone(); - let ratio = std::mem::size_of::() / std::mem::size_of::(); - let ptr = coords.as_mut_ptr() as *mut u8; - let len = coords.len() * ratio; - let cap = coords.capacity() * ratio; - std::mem::forget(coords); - unsafe { Vec::from_raw_parts(ptr, len, cap) } - }; + let coords = workspace + .coordinates + .iter() + .flat_map(|coord| coord.to_ne_bytes()) + .collect::>(); instance.coordinates(coords); handle_state.coordinates = workspace.coordinates.clone(); changed = true; } if handle_state.capabilities != workspace.capabilities { - let caps: Vec = { - let mut caps = workspace.capabilities.clone(); - let ratio = std::mem::size_of::() / std::mem::size_of::(); - let ptr = caps.as_mut_ptr() as *mut u8; - let len = caps.len() * ratio; - let cap = caps.capacity() * ratio; - std::mem::forget(caps); - unsafe { Vec::from_raw_parts(ptr, len, cap) } - }; + let caps = workspace + .capabilities + .iter() + .flat_map(|cap| (*cap as u32).to_ne_bytes()) + .collect::>(); instance.capabilities(caps); handle_state.capabilities = workspace.capabilities.clone(); changed = true; } if handle_state.states != workspace.states { - let states: Vec = { - let mut states = workspace.states.iter().cloned().collect::>(); - let ratio = std::mem::size_of::() - / std::mem::size_of::(); - let ptr = states.as_mut_ptr() as *mut u8; - let len = states.len() * ratio; - let cap = states.capacity() * ratio; - std::mem::forget(states); - unsafe { Vec::from_raw_parts(ptr, len, cap) } - }; + let states = workspace + .states + .iter() + .flat_map(|state| (*state as u32).to_ne_bytes()) + .collect::>(); instance.state(states); handle_state.states = workspace.states.clone(); changed = true;