diff options
| author | Thomas Levy <thomas.a.levy@gmail.com> | 2017-08-11 22:13:57 -0700 |
|---|---|---|
| committer | Thomas Levy <thomas.a.levy@gmail.com> | 2017-08-11 22:13:57 -0700 |
| commit | fb45233ed19af29fb38dc4208b3ca2c03244b841 (patch) | |
| tree | e484846cd07f85632fe50761221252de79c88da2 | |
| parent | b8266a90b9ffee04c1e4a33ec02a47b1299f1180 (diff) | |
| download | rust-fb45233ed19af29fb38dc4208b3ca2c03244b841.tar.gz rust-fb45233ed19af29fb38dc4208b3ca2c03244b841.zip | |
Handle DNS label compression in more places
| -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!(), |
