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:
@@ -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!(),
|
||||||
|
|||||||
Reference in New Issue
Block a user