Skip to content

Commit 1371b11

Browse files
authored
More bandaid fixes for invalid range index and other array access panics (esp-rs#1923)
1 parent 2e8937a commit 1371b11

File tree

4 files changed

+28
-8
lines changed

4 files changed

+28
-8
lines changed

esp-ieee802154/CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
99

1010
### Added
1111

12+
- Added additional checks to prevent various array access panics while processing frames
1213
- Added range check to avoid panic when indexing into RX_BUFFER slice
1314

1415
### Changed

esp-ieee802154/src/frame.rs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,9 +37,15 @@ pub struct ReceivedFrame {
3737
}
3838

3939
pub(crate) fn frame_is_ack_required(frame: &[u8]) -> bool {
40+
if frame.len() <= FRAME_AR_OFFSET {
41+
return false;
42+
}
4043
(frame[FRAME_AR_OFFSET] & FRAME_AR_BIT) != 0
4144
}
4245

4346
pub(crate) fn frame_get_version(frame: &[u8]) -> u8 {
47+
if frame.len() <= FRAME_VERSION_OFFSET {
48+
return 0;
49+
}
4450
frame[FRAME_VERSION_OFFSET] & FRAME_VERSION_MASK
4551
}

esp-ieee802154/src/lib.rs

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -159,12 +159,21 @@ impl<'a> Ieee802154<'a> {
159159
/// Get a received frame, if available
160160
pub fn get_received(&mut self) -> Option<Result<ReceivedFrame, Error>> {
161161
if let Some(raw) = ieee802154_poll() {
162-
let maybe_decoded =
163-
mac::Frame::try_read(&raw.data[1..][..raw.data[0] as usize], FooterMode::Explicit);
162+
let maybe_decoded = if raw.data[0] as usize > raw.data.len() {
163+
// try to decode up to data.len()
164+
mac::Frame::try_read(&raw.data[1..][..raw.data.len()], FooterMode::Explicit)
165+
} else {
166+
mac::Frame::try_read(&raw.data[1..][..raw.data[0] as usize], FooterMode::Explicit)
167+
};
164168

165169
let result = match maybe_decoded {
166170
Ok((decoded, _)) => {
167-
let rssi = raw.data[raw.data[0] as usize - 1] as i8; // crc is not written to rx buffer
171+
// crc is not written to rx buffer
172+
let rssi = if raw.data[0] as usize > raw.data.len() {
173+
raw.data[raw.data.len() - 1] as i8
174+
} else {
175+
raw.data[raw.data[0] as usize - 1] as i8
176+
};
168177

169178
Ok(ReceivedFrame {
170179
frame: Frame {

esp-ieee802154/src/raw.rs

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -19,13 +19,17 @@ use esp_wifi_sys::include::{
1919
use heapless::spsc::Queue;
2020

2121
use crate::{
22-
frame::{frame_get_version, frame_is_ack_required, FRAME_VERSION_1, FRAME_VERSION_2},
22+
frame::{
23+
frame_get_version,
24+
frame_is_ack_required,
25+
FRAME_SIZE,
26+
FRAME_VERSION_1,
27+
FRAME_VERSION_2,
28+
},
2329
hal::*,
2430
pib::*,
2531
};
2632

27-
pub(crate) const FRAME_SIZE: usize = 129;
28-
2933
const PHY_ENABLE_VERSION_PRINT: u32 = 1;
3034

3135
static mut RX_BUFFER: [u8; FRAME_SIZE] = [0u8; FRAME_SIZE];
@@ -391,9 +395,9 @@ fn ZB_MAC() {
391395
log::warn!("Receive queue full");
392396
}
393397

394-
let frm = if RX_BUFFER[0] > FRAME_SIZE as u8 {
398+
let frm = if RX_BUFFER[0] >= FRAME_SIZE as u8 {
395399
log::warn!("RX_BUFFER[0] {:} is larger than frame size", RX_BUFFER[0]);
396-
&RX_BUFFER[1..][..FRAME_SIZE]
400+
&RX_BUFFER[1..][..FRAME_SIZE - 1]
397401
} else {
398402
&RX_BUFFER[1..][..RX_BUFFER[0] as usize]
399403
};

0 commit comments

Comments
 (0)