From 5b31d6d5e00ab616e21f9b5766cc976155e3bbe3 Mon Sep 17 00:00:00 2001
From: Marcus Comstedt <marcus@mc.pp.se>
Date: Tue, 11 Apr 2000 22:45:12 +0200
Subject: [PATCH] Fixed incorrect bitorder in header decoding, and made QD
 decoding more logical.

Rev: lib/modules/Protocols.pmod/DNS.pmod:1.39
---
 lib/modules/Protocols.pmod/DNS.pmod | 32 +++++++++++++++--------------
 1 file changed, 17 insertions(+), 15 deletions(-)

diff --git a/lib/modules/Protocols.pmod/DNS.pmod b/lib/modules/Protocols.pmod/DNS.pmod
index 3e841c4bd1..b83a2b57fe 100644
--- a/lib/modules/Protocols.pmod/DNS.pmod
+++ b/lib/modules/Protocols.pmod/DNS.pmod
@@ -88,6 +88,8 @@ class protocol
 	  continue;
 	  
 	default:
+	  if((~len)&0xc0) 
+	    throw(({"Invalid message compression mode\n",backtrace()}));
 	  if(next==-1) next=pos+2;
 	  pos=((len&63)<<8) + msg[pos+1];
 	  continue;
@@ -181,29 +183,29 @@ class protocol
 	   m->ancount,
 	   m->nscount,
 	   m->arcount);
-    m->rd=(m->c1>>7)&1;
-    m->tc=(m->c1>>6)&1;
-    m->aa=(m->c1>>5)&1;
-    m->opcode=(m->c1>>1)&15;
-    m->qr=m->c1&1;
+    m->rd=m->c1&1;
+    m->tc=(m->c1>>1)&1;
+    m->aa=(m->c1>>2)&1;
+    m->opcode=(m->c1>>3)&15;
+    m->qr=(m->c1>>7)&1;
     
-    m->rcode=(m->c2>>4)&15;
-    m->cd=(m->c2>>3)&1;
-    m->ad=(m->c2>>2)&1;
-    m->ra=(m->c2)&1;
+    m->rcode=m->c2&15;
+    m->cd=(m->c2>>4)&1;
+    m->ad=(m->c2>>5)&1;
+    m->ra=(m->c2>>7)&1;
     
     m->length=strlen(s);
     
     array(string) tmp=({});
     int e;
     
-    if(m->qdcount!=1)
-      return m;
-    
     array(int) next=({12});
-    m->qd=decode_domain(s,next);
-    sscanf(s[next[0]..next[0]+3],"%2c%2c",m->type, m->cl);
-    next[0]+=4;
+    m->qd = allocate(m->qdcount);
+    for(int i=0; i<m->qdcount; i++) {
+      m->qd[i]=(["name":decode_domain(s,next)]);
+      sscanf(s[next[0]..next[0]+3],"%2c%2c",m->qd[i]->type, m->qd[i]->cl);
+      next[0]+=4;
+    }
     m->an=decode_entries(s,m->ancount,next);
     m->ns=decode_entries(s,m->nscount,next);
     m->ar=decode_entries(s,m->arcount,next);
-- 
GitLab