Add missing validation to avoid multicast enqueue on fPort=0.

This commit is contained in:
Orne Brocaar 2023-02-15 12:15:04 +00:00
parent 0126286f75
commit 6f10bd907e

View File

@ -101,6 +101,18 @@ pub struct MulticastGroupQueueItem {
pub emit_at_time_since_gps_epoch: Option<i64>,
}
impl MulticastGroupQueueItem {
fn validate(&self) -> Result<(), Error> {
if self.f_port == 0 || self.f_port > 255 {
return Err(Error::Validation(
"FPort must be between 1 - 255".to_string(),
));
}
Ok(())
}
}
impl Default for MulticastGroupQueueItem {
fn default() -> Self {
let now = Utc::now();
@ -437,6 +449,8 @@ pub async fn enqueue(
qi: MulticastGroupQueueItem,
gateway_ids: &[EUI64],
) -> Result<(Vec<Uuid>, u32), Error> {
qi.validate()?;
let (ids, f_cnt) = task::spawn_blocking({
let gateway_ids = gateway_ids.to_vec();
move || -> Result<(Vec<Uuid>, u32), Error> {
@ -1017,6 +1031,35 @@ pub mod test {
.await
.unwrap();
// invalid f_port
assert!(enqueue(
MulticastGroupQueueItem {
multicast_group_id: mg.id,
gateway_id: gw.gateway_id,
f_cnt: 1,
f_port: 0,
data: vec![3, 2, 1],
..Default::default()
},
&[gw.gateway_id],
)
.await
.is_err());
assert!(enqueue(
MulticastGroupQueueItem {
multicast_group_id: mg.id,
gateway_id: gw.gateway_id,
f_cnt: 1,
f_port: 256,
data: vec![3, 2, 1],
..Default::default()
},
&[gw.gateway_id],
)
.await
.is_err());
// Enqueue (Class-C) (delay)
let (ids, f_cnt) = enqueue(
MulticastGroupQueueItem {