diff options
| author | Guillaume Gomez <guillaume1.gomez@gmail.com> | 2017-08-13 11:03:12 +0200 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2017-08-13 11:03:12 +0200 |
| commit | b1a742794e2e69ef22a6352d310cf60955b8fc3c (patch) | |
| tree | 365ec12c16a27decbcf8d5e0a971fd3b63e986ca /src/libstd/sys | |
| parent | a91e8a2053d0136c479a39bec6368757bcfa4af9 (diff) | |
| parent | fb45233ed19af29fb38dc4208b3ca2c03244b841 (diff) | |
| download | rust-b1a742794e2e69ef22a6352d310cf60955b8fc3c.tar.gz rust-b1a742794e2e69ef22a6352d310cf60955b8fc3c.zip | |
Rollup merge of #43821 - NilSet:redox-dns, r=alexcrichton
Handle DNS label compression in more places in Redox name resolution
Diffstat (limited to 'src/libstd/sys')
| -rw-r--r-- | src/libstd/sys/redox/net/dns/mod.rs | 26 |
1 files changed, 12 insertions, 14 deletions
diff --git a/src/libstd/sys/redox/net/dns/mod.rs b/src/libstd/sys/redox/net/dns/mod.rs index 43c4fe7ac9d..49cde89dc05 100644 --- a/src/libstd/sys/redox/net/dns/mod.rs +++ b/src/libstd/sys/redox/net/dns/mod.rs @@ -102,6 +102,7 @@ impl Dns { } pub fn parse(data: &[u8]) -> Result<Self, String> { + let name_ind = 0b11000000; let mut i = 0; macro_rules! pop_u8 { @@ -147,9 +148,15 @@ impl Dns { () => { { let mut name = String::new(); + let old_i = i; loop { 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 { break; } @@ -161,6 +168,10 @@ impl Dns { } } + if i <= old_i { + i = old_i + 2; + } + name } }; @@ -184,21 +195,8 @@ impl Dns { let mut answers = Vec::new(); for _answer_i in 0..answers_len { - let name_ind = 0b11000000; - let name_test = pop_u8!(); - i -= 1; - answers.push(DnsAnswer { - name: if name_test & name_ind == name_ind { - 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!() - }, + name: pop_name!(), a_type: pop_n16!(), a_class: pop_n16!(), ttl_a: pop_n16!(), |
