Skip to content

Commit faa9d84

Browse files
committed
fix(rfel): convert data structure from byte array, avoid transmutes in source
Signed-off-by: Zhouqi Jiang <luojia@hust.edu.cn>
1 parent e1c8317 commit faa9d84

File tree

2 files changed

+43
-12
lines changed

2 files changed

+43
-12
lines changed

rfel/src/lib.rs

Lines changed: 28 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,9 @@ impl<'a> Fel<'a> {
2929
}
3030
}
3131
let (Some(endpoint_in), Some(endpoint_out)) = (endpoint_in, endpoint_out) else {
32-
error!("Malformed device. Allwinner USB FEL device should include exactly one bulk in and one bulk out endpoint.");
32+
error!(
33+
"Malformed device. Allwinner USB FEL device should include exactly one bulk in and one bulk out endpoint."
34+
);
3335
return Err(());
3436
};
3537
debug!(
@@ -50,7 +52,7 @@ impl<'a> Fel<'a> {
5052
self.send_fel_request(FelRequest::get_version());
5153
self.usb_read(&mut buf);
5254
self.read_fel_status();
53-
unsafe { core::mem::transmute(buf) }
55+
buf.into()
5456
})
5557
}
5658

@@ -76,7 +78,7 @@ impl<'a> Fel<'a> {
7678

7779
fn send_fel_request(&self, request: FelRequest) {
7880
trace!("send_fel_request");
79-
let buf: [u8; 16] = unsafe { core::mem::transmute(request) };
81+
let buf: [u8; 16] = request.into();
8082
self.usb_write(&buf);
8183
}
8284

@@ -88,8 +90,7 @@ impl<'a> Fel<'a> {
8890

8991
fn usb_read(&self, buf: &mut [u8]) {
9092
trace!("usb_read");
91-
let buf_1: [u8; 36] =
92-
unsafe { core::mem::transmute(UsbRequest::usb_read(buf.len() as u32)) };
93+
let buf_1: [u8; 36] = UsbRequest::usb_read(buf.len() as u32).into();
9394
block_on(self.iface.bulk_out(self.endpoint_out, buf_1.to_vec()))
9495
.status
9596
.expect("send_usb_request on usb_read transfer");
@@ -109,8 +110,7 @@ impl<'a> Fel<'a> {
109110

110111
fn usb_write(&self, buf: &[u8]) {
111112
trace!("usb_write");
112-
let buf_1: [u8; 36] =
113-
unsafe { core::mem::transmute(UsbRequest::usb_write(buf.len() as u32)) };
113+
let buf_1: [u8; 36] = UsbRequest::usb_write(buf.len() as u32).into();
114114
block_on(self.iface.bulk_out(self.endpoint_out, buf_1.to_vec()))
115115
.status
116116
.expect("send_usb_request on usb_write transfer");
@@ -164,6 +164,13 @@ impl UsbRequest {
164164
}
165165
}
166166

167+
impl From<UsbRequest> for [u8; 36] {
168+
#[inline]
169+
fn from(value: UsbRequest) -> Self {
170+
unsafe { core::mem::transmute(src) }
171+
}
172+
}
173+
167174
/// FEL request.
168175
#[repr(C)]
169176
struct FelRequest {
@@ -203,6 +210,13 @@ impl FelRequest {
203210
}
204211
}
205212

213+
impl From<FelRequest> for [u8; 16] {
214+
#[inline]
215+
fn from(value: FelRequest) -> Self {
216+
unsafe { core::mem::transmute(value) }
217+
}
218+
}
219+
206220
#[derive(Copy, Clone)]
207221
#[repr(C)]
208222
pub struct Version {
@@ -241,6 +255,13 @@ impl fmt::Debug for Version {
241255
}
242256
}
243257

258+
impl From<[u8; 32]> for Version {
259+
#[inline]
260+
fn from(value: [u8; 32]) -> Self {
261+
unsafe { core::mem::transmute(value) }
262+
}
263+
}
264+
244265
#[derive(Debug)]
245266
#[repr(u32)]
246267
pub enum Chip {

rfel/src/main.rs

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -73,14 +73,18 @@ fn main() {
7373
let address: usize = match parse_value(address.trim()) {
7474
Some(address) => address,
7575
None => {
76-
println!("error: invalid address, shoule be hexadecimal like 0x40000000, or decimal like 1073741824");
76+
println!(
77+
"error: invalid address, shoule be hexadecimal like 0x40000000, or decimal like 1073741824"
78+
);
7779
return;
7880
}
7981
};
8082
let length: usize = match parse_value(length.trim()) {
8183
Some(address) => address,
8284
None => {
83-
println!("error: invalid data, shoule be hexadecimal like 0x40000000, or decimal like 1073741824");
85+
println!(
86+
"error: invalid data, shoule be hexadecimal like 0x40000000, or decimal like 1073741824"
87+
);
8488
return;
8589
}
8690
};
@@ -97,7 +101,9 @@ fn main() {
97101
let address: u32 = match parse_value(address.trim()) {
98102
Some(address) => address,
99103
None => {
100-
println!("error: invalid address, shoule be hexadecimal like 0x40000000, or decimal like 1073741824");
104+
println!(
105+
"error: invalid address, shoule be hexadecimal like 0x40000000, or decimal like 1073741824"
106+
);
101107
return;
102108
}
103109
};
@@ -110,14 +116,18 @@ fn main() {
110116
let address: u32 = match parse_value(address.trim()) {
111117
Some(address) => address,
112118
None => {
113-
println!("error: invalid address, shoule be hexadecimal like 0x40000000, or decimal like 1073741824");
119+
println!(
120+
"error: invalid address, shoule be hexadecimal like 0x40000000, or decimal like 1073741824"
121+
);
114122
return;
115123
}
116124
};
117125
let value: u32 = match parse_value(value.trim()) {
118126
Some(value) => value,
119127
None => {
120-
println!("error: invalid address, shoule be hexadecimal like 0x40000000, or decimal like 1073741824");
128+
println!(
129+
"error: invalid address, shoule be hexadecimal like 0x40000000, or decimal like 1073741824"
130+
);
121131
return;
122132
}
123133
};

0 commit comments

Comments
 (0)