about summary refs log tree commit diff
diff options
context:
space:
mode:
authorThomas Levy <thomas.a.levy@gmail.com>2017-08-11 22:13:57 -0700
committerThomas Levy <thomas.a.levy@gmail.com>2017-08-11 22:13:57 -0700
commitfb45233ed19af29fb38dc4208b3ca2c03244b841 (patch)
treee484846cd07f85632fe50761221252de79c88da2
parentb8266a90b9ffee04c1e4a33ec02a47b1299f1180 (diff)
downloadrust-fb45233ed19af29fb38dc4208b3ca2c03244b841.tar.gz
rust-fb45233ed19af29fb38dc4208b3ca2c03244b841.zip
Handle DNS label compression in more places
-rw-r--r--src/libstd/sys/redox/net/dns/mod.rs26
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!(),