Skip to content

Commit a543bb7

Browse files
Jeff-A-Martincathay4t
authored andcommitted
link: Check buffer length when parsing NLAs
Verify the NlaBuffer has the expected size when parsing the `IFLA_XDP_ATTACHED` and `IFLA_VLAN_QOS_MAPPING` interface NLAs. This prevents a panic opportunity when attempting to parse malformed interface NLAs.
1 parent 984b358 commit a543bb7

File tree

2 files changed

+17
-9
lines changed

2 files changed

+17
-9
lines changed

src/link/link_info/vlan.rs

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -113,10 +113,17 @@ impl<'a, T: AsRef<[u8]> + ?Sized> Parseable<NlaBuffer<&'a T>>
113113
use VlanQosMapping::*;
114114
let payload = buf.value();
115115
Ok(match buf.kind() {
116-
IFLA_VLAN_QOS_MAPPING => Mapping(
117-
parse_u32(&payload[..4]).context("expected u32 from value")?,
118-
parse_u32(&payload[4..]).context("expected u32 to value")?,
119-
),
116+
IFLA_VLAN_QOS_MAPPING => {
117+
if payload.len() != 8 {
118+
return Err("invalid IFLA_VLAN_QOS_MAPPING value".into());
119+
}
120+
Mapping(
121+
parse_u32(&payload[..4])
122+
.context("expected u32 from value")?,
123+
parse_u32(&payload[4..])
124+
.context("expected u32 to value")?,
125+
)
126+
}
120127
kind => Other(DefaultNla::parse(buf).context(format!(
121128
"unknown NLA type {kind} for VLAN QoS mapping"
122129
))?),

src/link/xdp.rs

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ use anyhow::Context;
66
use byteorder::{ByteOrder, NativeEndian};
77
use netlink_packet_utils::{
88
nla::{DefaultNla, Nla, NlaBuffer, NlasIterator},
9-
parsers::{parse_i32, parse_u32},
9+
parsers::{parse_i32, parse_u32, parse_u8},
1010
DecodeError, Parseable,
1111
};
1212

@@ -98,10 +98,11 @@ impl<'a, T: AsRef<[u8]> + ?Sized> Parseable<NlaBuffer<&'a T>> for LinkXdp {
9898
IFLA_XDP_FD => Self::Fd(
9999
parse_i32(payload).context("invalid IFLA_XDP_FD value")?,
100100
),
101-
IFLA_XDP_ATTACHED => Self::Attached(
102-
XdpAttached::try_from(payload[0])
103-
.context("invalid IFLA_XDP_ATTACHED value")?,
104-
),
101+
IFLA_XDP_ATTACHED => {
102+
let err = "invalid IFLA_XDP_ATTACHED value";
103+
let value = parse_u8(payload).context(err)?;
104+
Self::Attached(XdpAttached::try_from(value).context(err)?)
105+
}
105106
IFLA_XDP_FLAGS => Self::Flags(
106107
parse_u32(payload).context("invalid IFLA_XDP_FLAGS value")?,
107108
),

0 commit comments

Comments
 (0)