Skip to content

Commit f164a24

Browse files
committed
Check remaining length when parsing open-ended RDATA.
1 parent c7593ee commit f164a24

7 files changed

Lines changed: 15 additions & 0 deletions

File tree

src/base/rdata.rs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -529,6 +529,12 @@ impl LongRecordData {
529529
}
530530
}
531531

532+
impl From<LongRecordData> for ParseError {
533+
fn from(src: LongRecordData) -> ParseError {
534+
ParseError::form_error(src.as_str())
535+
}
536+
}
537+
532538
impl fmt::Display for LongRecordData {
533539
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
534540
f.write_str(self.as_str())

src/rdata/cds.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -137,6 +137,7 @@ impl<Octs> Cdnskey<Octs> {
137137
Some(len) => len,
138138
None => return Err(ParseError::ShortInput),
139139
};
140+
LongRecordData::check_len(len)?;
140141
Ok(unsafe {
141142
Self::new_unchecked(
142143
u16::parse(parser)?,
@@ -470,6 +471,7 @@ impl<Octs> Cds<Octs> {
470471
Some(len) => len,
471472
None => return Err(ParseError::ShortInput),
472473
};
474+
LongRecordData::check_len(len)?;
473475
Ok(unsafe {
474476
Self::new_unchecked(
475477
u16::parse(parser)?,

src/rdata/dnssec.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -245,6 +245,7 @@ impl<Octs> Dnskey<Octs> {
245245
Some(len) => len,
246246
None => return Err(ParseError::ShortInput),
247247
};
248+
LongRecordData::check_len(len)?;
248249
Ok(unsafe {
249250
Self::new_unchecked(
250251
u16::parse(parser)?,
@@ -1042,6 +1043,7 @@ impl<Octs> Rrsig<Octs, ParsedName<Octs>> {
10421043
pub fn parse<'a, Src: Octets<Range<'a> = Octs> + ?Sized + 'a>(
10431044
parser: &mut Parser<'a, Src>,
10441045
) -> Result<Self, ParseError> {
1046+
LongRecordData::check_len(parser.remaining())?;
10451047
let type_covered = Rtype::parse(parser)?;
10461048
let algorithm = SecurityAlgorithm::parse(parser)?;
10471049
let labels = u8::parse(parser)?;
@@ -1826,6 +1828,7 @@ impl<Octs> Ds<Octs> {
18261828
Some(len) => len,
18271829
None => return Err(ParseError::ShortInput),
18281830
};
1831+
LongRecordData::check_len(parser.remaining())?;
18291832
Ok(unsafe {
18301833
Self::new_unchecked(
18311834
u16::parse(parser)?,

src/rdata/rfc1035/null.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -137,6 +137,7 @@ impl<Octs> Null<Octs> {
137137
parser: &mut Parser<'a, Src>,
138138
) -> Result<Self, ParseError> {
139139
let len = parser.remaining();
140+
LongRecordData::check_len(len)?;
140141
parser
141142
.parse_octets(len)
142143
.map(|res| unsafe { Self::from_octets_unchecked(res) })

src/rdata/rfc1035/txt.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -185,6 +185,7 @@ impl<Octs> Txt<Octs> {
185185
Octs: AsRef<[u8]>,
186186
{
187187
let len = parser.remaining();
188+
LongRecordData::check_len(len)?;
188189
let text = parser.parse_octets(len)?;
189190
let mut tmp = Parser::from_ref(text.as_ref());
190191
while tmp.remaining() != 0 {

src/rdata/svcb/rdata.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -175,6 +175,7 @@ impl<Variant, Octs: AsRef<[u8]>> SvcbRdata<Variant, Octs, ParsedName<Octs>> {
175175
pub fn parse<'a, Src: Octets<Range<'a> = Octs> + ?Sized + 'a>(
176176
parser: &mut Parser<'a, Src>,
177177
) -> Result<Self, ParseError> {
178+
LongRecordData::check_len(parser.remaining())?;
178179
let priority = u16::parse(parser)?;
179180
let target = ParsedName::parse(parser)?;
180181
let params = SvcParams::parse(parser)?;

src/rdata/tsig.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -307,6 +307,7 @@ impl<Octs> Tsig<Octs, ParsedName<Octs>> {
307307
pub fn parse<'a, Src: Octets<Range<'a> = Octs> + ?Sized + 'a>(
308308
parser: &mut Parser<'a, Src>,
309309
) -> Result<Self, ParseError> {
310+
LongRecordData::check_len(parser.remaining())?;
310311
let algorithm = ParsedName::parse(parser)?;
311312
let time_signed = Time48::parse(parser)?;
312313
let fudge = u16::parse(parser)?;

0 commit comments

Comments
 (0)