Rollup merge of #43821 - NilSet:redox-dns, r=alexcrichton

Handle DNS label compression in more places in Redox name resolution
This commit is contained in:
Guillaume Gomez
2017-08-13 11:03:12 +02:00
committed by GitHub

View File

@@ -102,6 +102,7 @@ impl Dns {
} }
pub fn parse(data: &[u8]) -> Result<Self, String> { pub fn parse(data: &[u8]) -> Result<Self, String> {
let name_ind = 0b11000000;
let mut i = 0; let mut i = 0;
macro_rules! pop_u8 { macro_rules! pop_u8 {
@@ -147,9 +148,15 @@ impl Dns {
() => { () => {
{ {
let mut name = String::new(); let mut name = String::new();
let old_i = i;
loop { loop {
let name_len = pop_u8!(); let name_len = pop_u8!();
if name_len & name_ind == name_ind {
i -= 1;
i = (pop_n16!() - ((name_ind as u16) << 8)) as usize;
continue;
}
if name_len == 0 { if name_len == 0 {
break; break;
} }
@@ -161,6 +168,10 @@ impl Dns {
} }
} }
if i <= old_i {
i = old_i + 2;
}
name name
} }
}; };
@@ -184,21 +195,8 @@ impl Dns {
let mut answers = Vec::new(); let mut answers = Vec::new();
for _answer_i in 0..answers_len { for _answer_i in 0..answers_len {
let name_ind = 0b11000000;
let name_test = pop_u8!();
i -= 1;
answers.push(DnsAnswer { answers.push(DnsAnswer {
name: if name_test & name_ind == name_ind { name: pop_name!(),
let name_off = pop_n16!() - ((name_ind as u16) << 8);
let old_i = i;
i = name_off as usize;
let name = pop_name!();
i = old_i;
name
} else {
pop_name!()
},
a_type: pop_n16!(), a_type: pop_n16!(),
a_class: pop_n16!(), a_class: pop_n16!(),
ttl_a: pop_n16!(), ttl_a: pop_n16!(),