@@ -24,6 +24,12 @@ public function parseChunk($data, Message $message)
2424 return ;
2525 }
2626 }
27+
28+ if ($ message ->header ['anCount ' ] != count ($ message ->answer )) {
29+ if (!$ this ->parseAnswer ($ message )) {
30+ return ;
31+ }
32+ }
2733 }
2834
2935 private function parseHeader (Message $ message )
@@ -81,10 +87,14 @@ private function parseQuestion(Message $message)
8187 }
8288 }
8389
90+ if (strlen ($ message ->data ) - $ consumed < 4 ) {
91+ return ;
92+ }
93+
8494 list ($ type , $ class ) = array_merge (unpack ('n* ' , substr ($ message ->data , $ consumed , 4 )));
8595 $ consumed += 4 ;
8696
87- $ message ->data = substr ($ message ->data , 0 , $ consumed );
97+ $ message ->data = substr ($ message ->data , $ consumed ) ?: '' ;
8898
8999 $ message ->question [] = array (
90100 'name ' => implode ('. ' , $ labels ),
@@ -99,7 +109,57 @@ private function parseQuestion(Message $message)
99109 return $ message ;
100110 }
101111
102- public function toBinary (Message $ message )
112+ private function parseAnswer (Message $ message )
103113 {
114+ if (strlen ($ message ->data ) < 2 ) {
115+ return ;
116+ }
117+
118+ $ consumed = 0 ;
119+
120+ $ length = ord (substr ($ message ->data , $ consumed , 1 ));
121+ $ consumed += 1 ;
122+
123+ if ($ length === 192 ) {
124+ $ labels [] = '@ ' ;
125+ $ consumed += 3 ;
126+ } else {
127+ while ($ length !== 0 ) {
128+ $ labels [] = substr ($ message ->data , $ consumed , $ length );
129+ $ consumed += $ length ;
130+
131+ $ length = ord (substr ($ message ->data , $ consumed , 1 ));
132+ $ consumed += 1 ;
133+
134+ if (strlen ($ message ->data ) - $ consumed < $ length ) {
135+ return ;
136+ }
137+ }
138+ }
139+
140+ if (strlen ($ message ->data ) - $ consumed < 10 ) {
141+ return ;
142+ }
143+
144+ list ($ type , $ class ) = array_merge (unpack ('n* ' , substr ($ message ->data , $ consumed , 4 )));
145+ $ consumed += 4 ;
146+
147+ list ($ ttl ) = array_merge (unpack ('l ' , substr ($ message ->data , $ consumed , 4 )));
148+ $ consumed += 4 ;
149+
150+ list ($ rdLength ) = array_merge (unpack ('n ' , substr ($ message ->data , $ consumed , 2 )));
151+ $ consumed += 2 ;
152+
153+ $ message ->data = substr ($ message ->data , $ consumed ) ?: '' ;
154+
155+ $ record = new Record ();
156+ $ record ->name = implode ('. ' , $ labels );
157+ $ record ->type = $ type ;
158+ $ record ->class = $ class ;
159+ $ record ->ttl = $ ttl ;
160+
161+ $ message ->answer [] = $ record ;
162+
163+ return $ message ;
104164 }
105165}
0 commit comments