Skip to content

Commit 2cc9539

Browse files
committed
blob: Use bytemuck and provide slice-variant
1 parent 41ce7ae commit 2cc9539

File tree

2 files changed

+19
-9
lines changed

2 files changed

+19
-9
lines changed

drm-ffi/src/mode.rs

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -639,12 +639,9 @@ pub fn get_property_blob(
639639
}
640640

641641
/// Create a property blob
642-
pub fn create_property_blob(
643-
fd: BorrowedFd<'_>,
644-
data: &mut [u8],
645-
) -> io::Result<drm_mode_create_blob> {
642+
pub fn create_property_blob(fd: BorrowedFd<'_>, data: &[u8]) -> io::Result<drm_mode_create_blob> {
646643
let mut blob = drm_mode_create_blob {
647-
data: data.as_mut_ptr() as _,
644+
data: data.as_ptr() as _,
648645
length: data.len() as _,
649646
..Default::default()
650647
};

src/control/mod.rs

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,6 @@ use std::error;
5656
use std::fmt;
5757
use std::io;
5858
use std::iter::Zip;
59-
use std::mem;
6059
use std::ops::RangeBounds;
6160
use std::os::unix::io::{AsFd, BorrowedFd, FromRawFd, OwnedFd, RawFd};
6261
use std::time::Duration;
@@ -534,9 +533,23 @@ pub trait Device: super::Device {
534533
}
535534

536535
/// Create a property blob value from a given data blob
537-
fn create_property_blob<T: ?Sized>(&self, data: &T) -> io::Result<property::Value<'static>> {
538-
let size = mem::size_of_val(data);
539-
let data = unsafe { std::slice::from_raw_parts_mut(data as *const _ as *mut u8, size) };
536+
fn create_property_blob<T: bytemuck::NoUninit>(
537+
&self,
538+
data: &T,
539+
) -> io::Result<property::Value<'static>> {
540+
let data = bytemuck::bytes_of(data);
541+
let blob = ffi::mode::create_property_blob(self.as_fd(), data)?;
542+
543+
Ok(property::Value::Blob(blob.blob_id.into()))
544+
}
545+
546+
/// Create a property blob value from a given data slice
547+
fn create_property_blob_from_slice<T: bytemuck::NoUninit>(
548+
&self,
549+
data: &[T],
550+
) -> io::Result<property::Value<'static>> {
551+
let data = bytemuck::try_cast_slice(data)
552+
.map_err(|_| io::Error::from(io::ErrorKind::InvalidData))?;
540553
let blob = ffi::mode::create_property_blob(self.as_fd(), data)?;
541554

542555
Ok(property::Value::Blob(blob.blob_id.into()))

0 commit comments

Comments
 (0)