Skip to content

Commit 684887e

Browse files
committed
Ensure the frame length
1 parent 8a99925 commit 684887e

File tree

4 files changed

+21
-13
lines changed

4 files changed

+21
-13
lines changed

Cargo.toml

+1
Original file line numberDiff line numberDiff line change
@@ -6,5 +6,6 @@ edition = "2021"
66
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
77

88
[dependencies]
9+
libc = "0.2"
910
socketcan = "2.0.0"
1011
thiserror = "1.0"

src/frame.rs

+7-5
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,18 @@
1+
use libc::CAN_MAX_DLEN;
12
use socketcan::EmbeddedFrame;
23

34
use crate::id::{CommunicationObject, NodeID};
45

56
trait ToSocketCANFrame {
67
fn communication_object(&self) -> CommunicationObject;
7-
fn set_data(&self, buf: &mut [u8]) -> usize;
8+
fn set_data(&self, data: &mut [u8]) -> usize;
89

910
fn to_socketcan_frame(&self) -> socketcan::CanFrame {
10-
let mut buf = [0u8; 8];
11-
let data_size = self.set_data(&mut buf);
12-
socketcan::CanFrame::new(self.communication_object(), &buf[0..data_size]).unwrap()
13-
// TODO: define original error type and return `Result` type
11+
let mut data = [0u8; CAN_MAX_DLEN];
12+
let data_size = self.set_data(&mut data);
13+
socketcan::CanFrame::new(self.communication_object(), &data[0..data_size]).unwrap()
14+
// The `new` method could return `None` if the data length is too long.
15+
// But its length is same as the limit.
1416
}
1517
}
1618

src/frame/nmt_node_control.rs

+5-1
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,8 @@ pub struct NMTNodeControlFrame {
3838
}
3939

4040
impl NMTNodeControlFrame {
41+
const FRAME_DATA_SIZE: usize = 2;
42+
4143
pub fn new(command: NMTCommand, address: NMTNodeControlAddress) -> Self {
4244
Self {
4345
command: command,
@@ -52,9 +54,11 @@ impl ToSocketCANFrame for NMTNodeControlFrame {
5254
}
5355

5456
fn set_data(&self, buf: &mut [u8]) -> usize {
57+
assert!(buf.len() >= Self::FRAME_DATA_SIZE);
58+
5559
buf[0] = self.command.to_byte();
5660
buf[1] = self.address.to_byte();
57-
2
61+
Self::FRAME_DATA_SIZE
5862
}
5963
}
6064

src/frame/sdo.rs

+8-7
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ pub struct SDOFrame {
3838

3939
impl SDOFrame {
4040
const FRAME_DATA_SIZE: usize = 8;
41+
const DATA_CONTENT_SIZE: usize = 4;
4142

4243
pub fn new_sdo_read_frame(node_id: NodeID, index: u16, sub_index: u8) -> Self {
4344
Self {
@@ -76,7 +77,7 @@ impl ToSocketCANFrame for SDOFrame {
7677

7778
fn set_data(&self, buf: &mut [u8]) -> usize {
7879
assert!(buf.len() >= Self::FRAME_DATA_SIZE);
79-
assert!(self.data.len() <= 4);
80+
assert!(self.data.len() <= Self::DATA_CONTENT_SIZE);
8081

8182
buf[0] = ((self.ccs as u8) << 5)
8283
+ match self.size_specified {
@@ -259,7 +260,7 @@ mod tests {
259260
data: vec![],
260261
}
261262
.set_data(&mut buf);
262-
assert_eq!(frame_data_size, SDOFrame::FRAME_DATA_SIZE);
263+
assert_eq!(frame_data_size, 8);
263264
assert_eq!(
264265
&buf[..frame_data_size],
265266
&[0x40, 0x18, 0x10, 0x02, 0x00, 0x00, 0x00, 0x00]
@@ -278,7 +279,7 @@ mod tests {
278279
data: vec![0xFF],
279280
}
280281
.set_data(&mut buf);
281-
assert_eq!(frame_data_size, SDOFrame::FRAME_DATA_SIZE);
282+
assert_eq!(frame_data_size, 8);
282283
assert_eq!(
283284
&buf[..frame_data_size],
284285
&[0x2F, 0x02, 0x14, 0x02, 0xFF, 0x00, 0x00, 0x00]
@@ -297,7 +298,7 @@ mod tests {
297298
data: vec![0xE8, 0x03],
298299
}
299300
.set_data(&mut buf);
300-
assert_eq!(frame_data_size, SDOFrame::FRAME_DATA_SIZE);
301+
assert_eq!(frame_data_size, 8);
301302
assert_eq!(
302303
&buf[..frame_data_size],
303304
&[0x2B, 0x17, 0x10, 0x00, 0xE8, 0x03, 0x00, 0x00]
@@ -316,7 +317,7 @@ mod tests {
316317
data: vec![0x0A, 0x06, 0x00, 0x00],
317318
}
318319
.set_data(&mut buf);
319-
assert_eq!(frame_data_size, SDOFrame::FRAME_DATA_SIZE);
320+
assert_eq!(frame_data_size, 8);
320321
assert_eq!(
321322
&buf[0..frame_data_size],
322323
&[0x23, 0x00, 0x12, 0x01, 0x0A, 0x06, 0x00, 0x00]
@@ -335,7 +336,7 @@ mod tests {
335336
data: vec![0x92, 0x01, 0x02, 0x00],
336337
}
337338
.set_data(&mut buf);
338-
assert_eq!(frame_data_size, SDOFrame::FRAME_DATA_SIZE);
339+
assert_eq!(frame_data_size, 8);
339340
assert_eq!(
340341
&buf[0..frame_data_size],
341342
&[0x43, 0x00, 0x10, 0x00, 0x92, 0x01, 0x02, 0x00]
@@ -354,7 +355,7 @@ mod tests {
354355
data: vec![0x02, 0x00, 0x01, 0x06], // SDO_ERR_ACCESS_RO
355356
}
356357
.set_data(&mut buf);
357-
assert_eq!(frame_data_size, SDOFrame::FRAME_DATA_SIZE);
358+
assert_eq!(frame_data_size, 8);
358359
assert_eq!(
359360
&buf[0..frame_data_size],
360361
&[0x80, 0x00, 0x10, 0x00, 0x02, 0x00, 0x01, 0x06]

0 commit comments

Comments
 (0)