Skip to content

Commit eefe409

Browse files
committed
break CNAME
1 parent f8fb9d1 commit eefe409

File tree

1 file changed

+34
-18
lines changed

1 file changed

+34
-18
lines changed

src/main.rs

Lines changed: 34 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -74,16 +74,16 @@ impl<'a> DNS<'a> {
7474
self.value[self.offset + 6] as u16 * 256 + self.value[self.offset + 7] as u16;
7575
count
7676
}
77-
// pub fn nscount(&self) -> u16 {
78-
// let count: u16 =
79-
// self.value[self.offset + 8] as u16 * 256 + self.value[self.offset + 9] as u16;
80-
// count
81-
// }
82-
// pub fn arcount(&self) -> u16 {
83-
// let count: u16 =
84-
// self.value[self.offset + 10] as u16 * 256 + self.value[self.offset + 11] as u16;
85-
// count
86-
// }
77+
pub fn nscount(&self) -> u16 {
78+
let count: u16 =
79+
self.value[self.offset + 8] as u16 * 256 + self.value[self.offset + 9] as u16;
80+
count
81+
}
82+
pub fn arcount(&self) -> u16 {
83+
let count: u16 =
84+
self.value[self.offset + 10] as u16 * 256 + self.value[self.offset + 11] as u16;
85+
count
86+
}
8787
pub fn question_list(&self) -> Vec<(String, &'static str)> {
8888
let mut vec = Vec::with_capacity(1);
8989
let mut j = 12;
@@ -167,19 +167,35 @@ impl<'a> DNS<'a> {
167167
// 若是真正的数据,会以0x00结尾;若是指针,指针占2个字节,第一个字节的高2位为11。
168168
for _ in 0..self.ancount() {
169169
if self.value[n] & 0b_1100_0000 == 0b_1100_0000 {
170-
let pointer =
171-
(self.value[n] & 0b_0011_1111) as u16 * 256 + self.value[n + 1] as u16;
172-
let rdlength = self.value[n + pointer as usize - 2] as u16 * 256
173-
+ self.value[n + pointer as usize - 1] as u16; // RDLENGTH
174-
vec.push(b2a(
175-
&self.value[n + pointer as usize..n + pointer as usize + rdlength as usize]
176-
));
177-
n += (pointer + rdlength) as usize;
170+
let qtype = self.value[n + 2] as u16 * 256 + self.value[n + 3] as u16;
171+
match qtype {
172+
0x0001 | 0x001c => {
173+
let pointer =
174+
(self.value[n] & 0b_0011_1111) as u16 * 256 + self.value[n + 1] as u16;
175+
let rdlength = self.value[n + pointer as usize - 2] as u16 * 256
176+
+ self.value[n + pointer as usize - 1] as u16; // RDLENGTH
177+
vec.push(b2a(
178+
&self.value[n + pointer as usize..n + pointer as usize + rdlength as usize]
179+
));
180+
n += (pointer + rdlength) as usize;
181+
},
182+
0x0005 => {
183+
vec.push("CNAME".to_string());
184+
break;
185+
},
186+
_ => vec.push("Unknown QTYPE".to_string()),
187+
}
188+
} else { // not pointer
189+
vec.push("Not Pointer".to_string());
190+
break;
178191
}
179192
}
180193
vec
181194
}
182195
pub fn answer(&self) -> String {
196+
if self.ancount() == 0 {
197+
return format!("Authority: {}, Additional: {}", self.nscount(), self.arcount());
198+
}
183199
let mut str = String::with_capacity(1024);
184200
for answer in self.answer_list() {
185201
str.push_str(&format!("{}, ", answer));

0 commit comments

Comments
 (0)