crosvm: Remove DataInit from windows components
TEST=CQ
TEST=turn on building for perfetto, and rust-analyzer doesn't
complain about things I changed.
BUG=b:204409584
Change-Id: I4c290304028ecd155069d6194f776360d48b4220
Reviewed-on: https://chromium-review.googlesource.com/c/crosvm/crosvm/+/4618952
Auto-Submit: Zihan Chen <zihanchen@google.com>
Reviewed-by: Noah Gold <nkgold@google.com>
Commit-Queue: Noah Gold <nkgold@google.com>
Reviewed-by: Dennis Kempin <denniskempin@google.com>
diff --git a/Cargo.lock b/Cargo.lock
index 8c00a5a..bd81047 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -1946,6 +1946,7 @@
"protobuf",
"serde",
"sync",
+ "zerocopy",
]
[[package]]
diff --git a/base/src/sys/windows/tube.rs b/base/src/sys/windows/tube.rs
index db88100..a0c188b 100644
--- a/base/src/sys/windows/tube.rs
+++ b/base/src/sys/windows/tube.rs
@@ -11,7 +11,7 @@
use std::os::windows::io::RawHandle;
use std::time::Duration;
-use data_model::DataInit;
+use data_model::zerocopy_from_slice;
use log::warn;
use once_cell::sync::Lazy;
use serde::de::DeserializeOwned;
@@ -19,6 +19,8 @@
use serde::Serialize;
use serde::Serializer;
use winapi::shared::winerror::ERROR_MORE_DATA;
+use zerocopy::AsBytes;
+use zerocopy::FromBytes;
use crate::descriptor::AsRawDescriptor;
use crate::descriptor::FromRawDescriptor;
@@ -80,16 +82,13 @@
}
}
-#[derive(Copy, Clone, Debug)]
+#[derive(Copy, Clone, Debug, AsBytes, FromBytes)]
#[repr(C)]
struct MsgHeader {
msg_json_size: usize,
descriptor_json_size: usize,
}
-// Safe because it only has data and has no implicit padding.
-unsafe impl DataInit for MsgHeader {}
-
static DH_TUBE: Lazy<sync::Mutex<Option<DuplicateHandleTube>>> =
Lazy::new(|| sync::Mutex::new(None));
static ALIAS_PID: Lazy<sync::Mutex<Option<u32>>> = Lazy::new(|| sync::Mutex::new(None));
@@ -242,10 +241,10 @@
};
let mut data_packet = Cursor::new(Vec::with_capacity(
- header.as_slice().len() + header.msg_json_size + header.descriptor_json_size,
+ header.as_bytes().len() + header.msg_json_size + header.descriptor_json_size,
));
data_packet
- .write(header.as_slice())
+ .write(header.as_bytes())
.map_err(Error::SendIoBuf)?;
data_packet
.write(msg_json.as_slice())
@@ -315,8 +314,8 @@
// Safe because the header is always written by the send function, and only that function
// writes to this channel.
- let header =
- MsgHeader::from_slice(header_bytes.as_slice()).expect("Tube header failed to deserialize.");
+ let header: &MsgHeader =
+ zerocopy_from_slice(header_bytes.as_slice()).expect("Tube header failed to deserialize.");
let mut msg_json = vec![0u8; header.msg_json_size];
perform_read(&mut read_fn, msg_json.as_mut_slice()).map_err(Error::from_recv_io_error)?;
diff --git a/perfetto/Cargo.toml b/perfetto/Cargo.toml
index 92b4e8b..fcb6204 100644
--- a/perfetto/Cargo.toml
+++ b/perfetto/Cargo.toml
@@ -24,6 +24,7 @@
serde = { version = "1", features = [ "derive" ] }
sha2 = { version = "*", optional = true }
sync = { path = "../common/sync" }
+zerocopy = "*"
[build-dependencies]
proto_build_tools = { path = "../proto_build_tools" }
diff --git a/perfetto/src/lib.rs b/perfetto/src/lib.rs
index 2f35aef..9882de4 100644
--- a/perfetto/src/lib.rs
+++ b/perfetto/src/lib.rs
@@ -19,8 +19,9 @@
pub use bindings::*;
pub use cros_tracing_types::static_strings::StaticString;
use cros_tracing_types::TraceDuration;
-use data_model::DataInit;
use protobuf::Message;
+use zerocopy::AsBytes;
+use zerocopy::FromBytes;
use protos::perfetto_config::trace_config::BufferConfig;
use protos::perfetto_config::trace_config::DataSource;
@@ -34,16 +35,13 @@
/// The optional header written ahead of the trace data.
#[repr(C)]
-#[derive(Copy, Clone)]
+#[derive(Copy, Clone, AsBytes, FromBytes)]
struct TraceHeader {
magic: [u8; 16],
data_size: u64,
data_checksum_sha256: [u8; 32],
}
-// Safe because TraceHeader has no implicit padding.
-unsafe impl DataInit for TraceHeader {}
-
#[macro_export]
macro_rules! zero {
($x:ident) => {
@@ -564,7 +562,7 @@
};
let mut trace_vec: Vec<u8> =
Vec::with_capacity(size_of::<TraceHeader>() + trace_data.size as usize);
- trace_vec.extend_from_slice(header.as_slice());
+ trace_vec.extend_from_slice(header.as_bytes());
trace_vec.extend_from_slice(trace_data_slice);
// Safe because trace data is a valid buffer created by ctrace_stop_trace_to_buffer and