Skip to content

Commit 03a2092

Browse files
committed
[Dns] Fix response RR parsing
1 parent 1a3fd92 commit 03a2092

1 file changed

Lines changed: 25 additions & 7 deletions

File tree

Parser.php

Lines changed: 25 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -117,13 +117,17 @@ private function parseAnswer(Message $message)
117117

118118
$consumed = 0;
119119

120-
$length = ord(substr($message->data, $consumed, 1));
121-
$consumed += 1;
120+
$mask = 0xc000; // 1100000000000000
121+
list($nameOffset) = array_merge(unpack('n', substr($message->data, $consumed, 2)));
122122

123-
if ($length === 192) {
124-
$labels[] = '@';
125-
$consumed += 3;
123+
if ($nameOffset & $mask) {
124+
$consumed += 2;
125+
$labels[] = $message->question[0]['name'];
126+
// TODO: get proper offset
126127
} else {
128+
$length = ord(substr($message->data, $consumed, 1));
129+
$consumed += 1;
130+
127131
while ($length !== 0) {
128132
$labels[] = substr($message->data, $consumed, $length);
129133
$consumed += $length;
@@ -144,22 +148,36 @@ private function parseAnswer(Message $message)
144148
list($type, $class) = array_merge(unpack('n*', substr($message->data, $consumed, 4)));
145149
$consumed += 4;
146150

147-
list($ttl) = array_merge(unpack('l', substr($message->data, $consumed, 4)));
151+
list($ttl) = array_merge(unpack('N', substr($message->data, $consumed, 4)));
148152
$consumed += 4;
149153

150154
list($rdLength) = array_merge(unpack('n', substr($message->data, $consumed, 2)));
151155
$consumed += 2;
152156

157+
$rdata = null;
158+
if (Message::TYPE_A === $type) {
159+
$ip = substr($message->data, $consumed, $rdLength);
160+
$consumed += $rdLength;
161+
162+
$rdata = inet_ntop($ip);
163+
}
164+
153165
$message->data = substr($message->data, $consumed) ?: '';
154166

155167
$record = new Record();
156168
$record->name = implode('.', $labels);
157169
$record->type = $type;
158170
$record->class = $class;
159-
$record->ttl = $ttl;
171+
$record->ttl = $this->signedLongToUnsignedLong($ttl);
172+
$record->data = $rdata;
160173

161174
$message->answer[] = $record;
162175

163176
return $message;
164177
}
178+
179+
private function signedLongToUnsignedLong($i)
180+
{
181+
return $i & 0x80000000 ? $i - 0xffffffff : $i;
182+
}
165183
}

0 commit comments

Comments
 (0)