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<u8>` from a type with a greater alignment. This isn't hard to avoid, luckily.
This commit is contained in:
parent
50d6dc3d21
commit
540ed3d170
4 changed files with 43 additions and 78 deletions
|
|
@ -139,14 +139,10 @@ impl Session {
|
||||||
let node = Vec::from(dma.node.dev_id().to_ne_bytes());
|
let node = Vec::from(dma.node.dev_id().to_ne_bytes());
|
||||||
self.obj.dmabuf_device(node);
|
self.obj.dmabuf_device(node);
|
||||||
for (fmt, modifiers) in &dma.formats {
|
for (fmt, modifiers) in &dma.formats {
|
||||||
let mut modifiers = modifiers.clone();
|
let modifiers = modifiers
|
||||||
let modifiers: Vec<u8> = {
|
.iter()
|
||||||
let ptr = modifiers.as_mut_ptr() as *mut u8;
|
.flat_map(|modifier| u64::from(*modifier).to_ne_bytes())
|
||||||
let len = modifiers.len() * 4;
|
.collect::<Vec<u8>>();
|
||||||
let cap = modifiers.capacity() * 4;
|
|
||||||
std::mem::forget(modifiers);
|
|
||||||
unsafe { Vec::from_raw_parts(ptr, len, cap) }
|
|
||||||
};
|
|
||||||
self.obj.dmabuf_format(*fmt as u32, modifiers);
|
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());
|
let node = Vec::from(dma.node.dev_id().to_ne_bytes());
|
||||||
session_obj.dmabuf_device(node);
|
session_obj.dmabuf_device(node);
|
||||||
for (fmt, modifiers) in &dma.formats {
|
for (fmt, modifiers) in &dma.formats {
|
||||||
let mut modifiers = modifiers.clone();
|
let modifiers = modifiers
|
||||||
let modifiers: Vec<u8> = {
|
.iter()
|
||||||
let ptr = modifiers.as_mut_ptr() as *mut u8;
|
.flat_map(|modifier| u64::from(*modifier).to_ne_bytes())
|
||||||
let len = modifiers.len() * 4;
|
.collect::<Vec<u8>>();
|
||||||
let cap = modifiers.capacity() * 4;
|
|
||||||
std::mem::forget(modifiers);
|
|
||||||
unsafe { Vec::from_raw_parts(ptr, len, cap) }
|
|
||||||
};
|
|
||||||
session_obj.dmabuf_format(*fmt as u32, modifiers);
|
session_obj.dmabuf_format(*fmt as u32, modifiers);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -747,14 +739,10 @@ where
|
||||||
let node = Vec::from(dma.node.dev_id().to_ne_bytes());
|
let node = Vec::from(dma.node.dev_id().to_ne_bytes());
|
||||||
session.dmabuf_device(node);
|
session.dmabuf_device(node);
|
||||||
for (fmt, modifiers) in &dma.formats {
|
for (fmt, modifiers) in &dma.formats {
|
||||||
let mut modifiers = modifiers.clone();
|
let modifiers = modifiers
|
||||||
let modifiers: Vec<u8> = {
|
.iter()
|
||||||
let ptr = modifiers.as_mut_ptr() as *mut u8;
|
.flat_map(|modifier| u64::from(*modifier).to_ne_bytes())
|
||||||
let len = modifiers.len() * 4;
|
.collect::<Vec<u8>>();
|
||||||
let cap = modifiers.capacity() * 4;
|
|
||||||
std::mem::forget(modifiers);
|
|
||||||
unsafe { Vec::from_raw_parts(ptr, len, cap) }
|
|
||||||
};
|
|
||||||
session.dmabuf_format(*fmt as u32, modifiers);
|
session.dmabuf_format(*fmt as u32, modifiers);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -509,14 +509,10 @@ where
|
||||||
}
|
}
|
||||||
handle_state.states = states.clone();
|
handle_state.states = states.clone();
|
||||||
|
|
||||||
let states: Vec<u8> = {
|
let states = states
|
||||||
let ratio = std::mem::size_of::<States>() / std::mem::size_of::<u8>();
|
.iter()
|
||||||
let ptr = states.as_mut_ptr() as *mut u8;
|
.flat_map(|state| (*state as u32).to_ne_bytes())
|
||||||
let len = states.len() * ratio;
|
.collect::<Vec<u8>>();
|
||||||
let cap = states.capacity() * ratio;
|
|
||||||
std::mem::forget(states);
|
|
||||||
unsafe { Vec::from_raw_parts(ptr, len, cap) }
|
|
||||||
};
|
|
||||||
instance.state(states);
|
instance.state(states);
|
||||||
changed = true;
|
changed = true;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -151,15 +151,13 @@ where
|
||||||
data_init: &mut DataInit<'_, D>,
|
data_init: &mut DataInit<'_, D>,
|
||||||
) {
|
) {
|
||||||
let instance = data_init.init(resource, ());
|
let instance = data_init.init(resource, ());
|
||||||
let capabilities = {
|
let capabilities = state
|
||||||
let mut caps = state.toplevel_management_state().capabilities.clone();
|
.toplevel_management_state()
|
||||||
let ratio = std::mem::size_of::<ManagementCapabilities>() / std::mem::size_of::<u8>();
|
.capabilities
|
||||||
let ptr = caps.as_mut_ptr() as *mut u8;
|
.iter()
|
||||||
let len = caps.len() * ratio;
|
.flat_map(|cap| (*cap as u32).to_ne_bytes())
|
||||||
let cap = caps.capacity() * ratio;
|
.collect::<Vec<u8>>();
|
||||||
std::mem::forget(caps);
|
|
||||||
unsafe { Vec::from_raw_parts(ptr, len, cap) }
|
|
||||||
};
|
|
||||||
instance.capabilities(capabilities);
|
instance.capabilities(capabilities);
|
||||||
state.toplevel_management_state().instances.push(instance);
|
state.toplevel_management_state().instances.push(instance);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -929,15 +929,11 @@ where
|
||||||
}
|
}
|
||||||
|
|
||||||
if handle_state.capabilities != group.capabilities {
|
if handle_state.capabilities != group.capabilities {
|
||||||
let caps: Vec<u8> = {
|
let caps = group
|
||||||
let mut caps = group.capabilities.clone();
|
.capabilities
|
||||||
let ratio = std::mem::size_of::<GroupCapabilities>() / std::mem::size_of::<u8>();
|
.iter()
|
||||||
let ptr = caps.as_mut_ptr() as *mut u8;
|
.flat_map(|cap| (*cap as u32).to_ne_bytes())
|
||||||
let len = caps.len() * ratio;
|
.collect::<Vec<u8>>();
|
||||||
let cap = caps.capacity() * ratio;
|
|
||||||
std::mem::forget(caps);
|
|
||||||
unsafe { Vec::from_raw_parts(ptr, len, cap) }
|
|
||||||
};
|
|
||||||
instance.capabilities(caps);
|
instance.capabilities(caps);
|
||||||
handle_state.capabilities = group.capabilities.clone();
|
handle_state.capabilities = group.capabilities.clone();
|
||||||
changed = true;
|
changed = true;
|
||||||
|
|
@ -1005,44 +1001,31 @@ where
|
||||||
changed = true;
|
changed = true;
|
||||||
}
|
}
|
||||||
if handle_state.coordinates != workspace.coordinates {
|
if handle_state.coordinates != workspace.coordinates {
|
||||||
let coords: Vec<u8> = {
|
let coords = workspace
|
||||||
let mut coords = workspace.coordinates.clone();
|
.coordinates
|
||||||
let ratio = std::mem::size_of::<u32>() / std::mem::size_of::<u8>();
|
.iter()
|
||||||
let ptr = coords.as_mut_ptr() as *mut u8;
|
.flat_map(|coord| coord.to_ne_bytes())
|
||||||
let len = coords.len() * ratio;
|
.collect::<Vec<u8>>();
|
||||||
let cap = coords.capacity() * ratio;
|
|
||||||
std::mem::forget(coords);
|
|
||||||
unsafe { Vec::from_raw_parts(ptr, len, cap) }
|
|
||||||
};
|
|
||||||
instance.coordinates(coords);
|
instance.coordinates(coords);
|
||||||
handle_state.coordinates = workspace.coordinates.clone();
|
handle_state.coordinates = workspace.coordinates.clone();
|
||||||
changed = true;
|
changed = true;
|
||||||
}
|
}
|
||||||
if handle_state.capabilities != workspace.capabilities {
|
if handle_state.capabilities != workspace.capabilities {
|
||||||
let caps: Vec<u8> = {
|
let caps = workspace
|
||||||
let mut caps = workspace.capabilities.clone();
|
.capabilities
|
||||||
let ratio = std::mem::size_of::<WorkspaceCapabilities>() / std::mem::size_of::<u8>();
|
.iter()
|
||||||
let ptr = caps.as_mut_ptr() as *mut u8;
|
.flat_map(|cap| (*cap as u32).to_ne_bytes())
|
||||||
let len = caps.len() * ratio;
|
.collect::<Vec<u8>>();
|
||||||
let cap = caps.capacity() * ratio;
|
|
||||||
std::mem::forget(caps);
|
|
||||||
unsafe { Vec::from_raw_parts(ptr, len, cap) }
|
|
||||||
};
|
|
||||||
instance.capabilities(caps);
|
instance.capabilities(caps);
|
||||||
handle_state.capabilities = workspace.capabilities.clone();
|
handle_state.capabilities = workspace.capabilities.clone();
|
||||||
changed = true;
|
changed = true;
|
||||||
}
|
}
|
||||||
if handle_state.states != workspace.states {
|
if handle_state.states != workspace.states {
|
||||||
let states: Vec<u8> = {
|
let states = workspace
|
||||||
let mut states = workspace.states.iter().cloned().collect::<Vec<_>>();
|
.states
|
||||||
let ratio = std::mem::size_of::<zcosmic_workspace_handle_v1::State>()
|
.iter()
|
||||||
/ std::mem::size_of::<u8>();
|
.flat_map(|state| (*state as u32).to_ne_bytes())
|
||||||
let ptr = states.as_mut_ptr() as *mut u8;
|
.collect::<Vec<u8>>();
|
||||||
let len = states.len() * ratio;
|
|
||||||
let cap = states.capacity() * ratio;
|
|
||||||
std::mem::forget(states);
|
|
||||||
unsafe { Vec::from_raw_parts(ptr, len, cap) }
|
|
||||||
};
|
|
||||||
instance.state(states);
|
instance.state(states);
|
||||||
handle_state.states = workspace.states.clone();
|
handle_state.states = workspace.states.clone();
|
||||||
changed = true;
|
changed = true;
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue