Skip to content

Commit bbfcef4

Browse files
committed
Make sure that bytes passed into creating a new NinaParam* do not exceed the type's max siz (for new())e.
1 parent 0453761 commit bbfcef4

File tree

2 files changed

+45
-22
lines changed

2 files changed

+45
-22
lines changed

esp32-wroom-rp/src/protocol.rs

Lines changed: 33 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ where
5151
// Length of parameter in bytes
5252
type LengthAsBytes: IntoIterator<Item = u8>;
5353

54-
fn new(data: &str) -> Self;
54+
fn new(data: &str) -> Result<Self, Error>;
5555

5656
fn from_bytes(bytes: &[u8]) -> Result<Self, Error>;
5757

@@ -171,17 +171,21 @@ impl NinaConcreteParam for NinaByteParam {
171171
type DataBuffer = Vec<u8, MAX_NINA_BYTE_PARAM_BUFFER_LENGTH>;
172172
type LengthAsBytes = [u8; 1];
173173

174-
fn new(data: &str) -> Self {
174+
fn new(data: &str) -> Result<Self, Error> {
175+
if data.len() > MAX_NINA_BYTE_PARAM_BUFFER_LENGTH {
176+
return Err(ProtocolError::PayloadTooLarge.into());
177+
}
178+
175179
let data_as_bytes: Self::DataBuffer = String::from(data).into_bytes();
176-
Self {
180+
Ok(Self {
177181
length: data_as_bytes.len() as u8,
178182
data: data_as_bytes,
179-
}
183+
})
180184
}
181185

182186
fn from_bytes(bytes: &[u8]) -> Result<Self, Error> {
183187
if bytes.len() > MAX_NINA_BYTE_PARAM_BUFFER_LENGTH {
184-
return Err(ProtocolError::TooManyParameters.into());
188+
return Err(ProtocolError::PayloadTooLarge.into());
185189
}
186190

187191
let mut data_as_bytes: Self::DataBuffer = Vec::new();
@@ -218,17 +222,21 @@ impl NinaConcreteParam for NinaWordParam {
218222
type DataBuffer = Vec<u8, MAX_NINA_WORD_PARAM_BUFFER_LENGTH>;
219223
type LengthAsBytes = [u8; 1];
220224

221-
fn new(data: &str) -> Self {
225+
fn new(data: &str) -> Result<Self, Error> {
226+
if data.len() > MAX_NINA_WORD_PARAM_BUFFER_LENGTH {
227+
return Err(ProtocolError::PayloadTooLarge.into());
228+
}
229+
222230
let data_as_bytes: Self::DataBuffer = String::from(data).into_bytes();
223-
Self {
231+
Ok(Self {
224232
length: data_as_bytes.len() as u8,
225233
data: data_as_bytes,
226-
}
234+
})
227235
}
228236

229237
fn from_bytes(bytes: &[u8]) -> Result<Self, Error> {
230238
if bytes.len() > MAX_NINA_WORD_PARAM_BUFFER_LENGTH {
231-
return Err(ProtocolError::TooManyParameters.into());
239+
return Err(ProtocolError::PayloadTooLarge.into());
232240
}
233241

234242
let mut data_as_bytes: Self::DataBuffer = Vec::new();
@@ -265,17 +273,21 @@ impl NinaConcreteParam for NinaSmallArrayParam {
265273
type DataBuffer = Vec<u8, MAX_NINA_SMALL_ARRAY_PARAM_BUFFER_LENGTH>;
266274
type LengthAsBytes = [u8; 1];
267275

268-
fn new(data: &str) -> Self {
276+
fn new(data: &str) -> Result<Self, Error> {
277+
if data.len() > MAX_NINA_SMALL_ARRAY_PARAM_BUFFER_LENGTH {
278+
return Err(ProtocolError::PayloadTooLarge.into());
279+
}
280+
269281
let data_as_bytes: Self::DataBuffer = String::from(data).into_bytes();
270-
Self {
282+
Ok(Self {
271283
length: data_as_bytes.len() as u8,
272284
data: data_as_bytes,
273-
}
285+
})
274286
}
275287

276288
fn from_bytes(bytes: &[u8]) -> Result<Self, Error> {
277289
if bytes.len() > MAX_NINA_SMALL_ARRAY_PARAM_BUFFER_LENGTH {
278-
return Err(ProtocolError::TooManyParameters.into());
290+
return Err(ProtocolError::PayloadTooLarge.into());
279291
}
280292

281293
let mut data_as_bytes: Self::DataBuffer = Vec::new();
@@ -312,17 +324,21 @@ impl NinaConcreteParam for NinaLargeArrayParam {
312324
type DataBuffer = Vec<u8, MAX_NINA_LARGE_ARRAY_PARAM_BUFFER_LENGTH>;
313325
type LengthAsBytes = [u8; 2];
314326

315-
fn new(data: &str) -> Self {
327+
fn new(data: &str) -> Result<Self, Error> {
328+
if data.len() > MAX_NINA_LARGE_ARRAY_PARAM_BUFFER_LENGTH {
329+
return Err(ProtocolError::PayloadTooLarge.into());
330+
}
331+
316332
let data_as_bytes: Self::DataBuffer = String::from(data).into_bytes();
317-
Self {
333+
Ok(Self {
318334
length: data_as_bytes.len() as u16,
319335
data: data_as_bytes,
320-
}
336+
})
321337
}
322338

323339
fn from_bytes(bytes: &[u8]) -> Result<Self, Error> {
324340
if bytes.len() > MAX_NINA_LARGE_ARRAY_PARAM_BUFFER_LENGTH {
325-
return Err(ProtocolError::TooManyParameters.into());
341+
return Err(ProtocolError::PayloadTooLarge.into());
326342
}
327343

328344
let mut data_as_bytes: Self::DataBuffer = Vec::new();

esp32-wroom-rp/src/spi.rs

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -59,8 +59,12 @@ where
5959

6060
fn set_passphrase(&mut self, ssid: &str, passphrase: &str) -> Result<(), Error> {
6161
let operation = Operation::new(NinaCommand::SetPassphrase)
62-
.param(NinaSmallArrayParam::new(ssid).into())
63-
.param(NinaSmallArrayParam::new(passphrase).into());
62+
.param(NinaSmallArrayParam::new(ssid).unwrap_or_default().into())
63+
.param(
64+
NinaSmallArrayParam::new(passphrase)
65+
.unwrap_or_default()
66+
.into(),
67+
);
6468

6569
self.execute(&operation)?;
6670

@@ -114,8 +118,11 @@ where
114118
}
115119

116120
fn req_host_by_name(&mut self, hostname: &str) -> Result<u8, Error> {
117-
let operation = Operation::new(NinaCommand::ReqHostByName)
118-
.param(NinaSmallArrayParam::new(hostname).into());
121+
let operation = Operation::new(NinaCommand::ReqHostByName).param(
122+
NinaSmallArrayParam::new(hostname)
123+
.unwrap_or_default()
124+
.into(),
125+
);
119126

120127
self.execute(&operation)?;
121128

@@ -251,7 +258,7 @@ where
251258
.unwrap_or_default()
252259
.into(),
253260
)
254-
.param(NinaLargeArrayParam::new(data).into());
261+
.param(NinaLargeArrayParam::new(data).unwrap_or_default().into());
255262

256263
self.execute(&operation)?;
257264

0 commit comments

Comments
 (0)