X-Git-Url: http://git.bitcoin.ninja/index.cgi?a=blobdiff_plain;f=src%2Fser.rs;h=779bcec194ffa915a04906623d0ee48818b97ed7;hb=99c90e3e3a77d431e3c6b7149aa43f93a793f579;hp=0f7da1608b08ae8431118f611703074226d9d299;hpb=e4503cf90b6ad5ed9edc99389956ceffb1c35502;p=dnssec-prover diff --git a/src/ser.rs b/src/ser.rs index 0f7da16..779bcec 100644 --- a/src/ser.rs +++ b/src/ser.rs @@ -4,6 +4,7 @@ use alloc::vec::Vec; use alloc::string::String; use crate::rr::*; +use crate::query::QueryBuf; pub(crate) fn read_u8(inp: &mut &[u8]) -> Result { let res = *inp.get(0).ok_or(())?; @@ -25,16 +26,16 @@ pub(crate) fn read_u32(inp: &mut &[u8]) -> Result { Ok(u32::from_be_bytes(bytes)) } -fn read_wire_packet_labels(inp: &mut &[u8], wire_packet: &[u8], name: &mut String) -> Result<(), ()> { +fn do_read_wire_packet_labels(inp: &mut &[u8], wire_packet: &[u8], name: &mut String, recursion_limit: usize) -> Result<(), ()> { loop { let len = read_u8(inp)? as usize; if len == 0 { if name.is_empty() { *name += "."; } break; - } else if len >= 0xc0 { + } else if len >= 0xc0 && recursion_limit > 0 { let offs = ((len & !0xc0) << 8) | read_u8(inp)? as usize; if offs >= wire_packet.len() { return Err(()); } - read_wire_packet_labels(&mut &wire_packet[offs..], wire_packet, name)?; + do_read_wire_packet_labels(&mut &wire_packet[offs..], wire_packet, name, recursion_limit - 1)?; break; } if inp.len() <= len { return Err(()); } @@ -46,6 +47,10 @@ fn read_wire_packet_labels(inp: &mut &[u8], wire_packet: &[u8], name: &mut Strin Ok(()) } +fn read_wire_packet_labels(inp: &mut &[u8], wire_packet: &[u8], name: &mut String) -> Result<(), ()> { + do_read_wire_packet_labels(inp, wire_packet, name, 255) +} + pub(crate) fn read_wire_packet_name(inp: &mut &[u8], wire_packet: &[u8]) -> Result { let mut name = String::with_capacity(1024); read_wire_packet_labels(inp, wire_packet, &mut name)?; @@ -54,6 +59,7 @@ pub(crate) fn read_wire_packet_name(inp: &mut &[u8], wire_packet: &[u8]) -> Resu pub(crate) trait Writer { fn write(&mut self, buf: &[u8]); } impl Writer for Vec { fn write(&mut self, buf: &[u8]) { self.extend_from_slice(buf); } } +impl Writer for QueryBuf { fn write(&mut self, buf: &[u8]) { self.extend_from_slice(buf); } } #[cfg(feature = "validation")] impl Writer for ring::digest::Context { fn write(&mut self, buf: &[u8]) { self.update(buf); } } pub(crate) fn write_name(out: &mut W, name: &str) { @@ -96,6 +102,7 @@ pub(crate) fn parse_wire_packet_rr(inp: &mut &[u8], wire_packet: &[u8]) -> Resul NS::TYPE => RR::NS(NS::read_from_data(name, data, wire_packet)?), Txt::TYPE => RR::Txt(Txt::read_from_data(name, data, wire_packet)?), CName::TYPE => RR::CName(CName::read_from_data(name, data, wire_packet)?), + DName::TYPE => RR::DName(DName::read_from_data(name, data, wire_packet)?), TLSA::TYPE => RR::TLSA(TLSA::read_from_data(name, data, wire_packet)?), DnsKey::TYPE => RR::DnsKey(DnsKey::read_from_data(name, data, wire_packet)?), DS::TYPE => RR::DS(DS::read_from_data(name, data, wire_packet)?),