chiark / gitweb /
+ * Add test case for recursion (infinite loop) domain compression.
authorian <ian>
Thu, 2 Mar 2000 01:45:37 +0000 (01:45 +0000)
committerian <ian>
Thu, 2 Mar 2000 01:45:37 +0000 (01:45 +0000)
@@ -9,6 +9,7 @@
+  * Add test case for recursion (infinite loop) domain compression.

changelog
regress/case-comprinf.err [new file with mode: 0644]
regress/case-comprinf.out [new file with mode: 0644]
regress/case-comprinf.sys [new file with mode: 0644]
src/internal.h
src/transmit.c

index 942f20bd2c3fc87c873580fab3d69f11f062abc1..16580a6943e5440f35099b537579e1b84558525b 100644 (file)
--- a/changelog
+++ b/changelog
@@ -9,6 +9,7 @@ adns (0.7) BETA; urgency=medium
   * Better checking of long domain names and labels in queries.
   * answer->owner may be null on error.  Documented, and adnshost copes.
   * Better reporting of unexpected or weird replies from nameserver.
+  * Add test case for recursion (infinite loop) domain compression.
 
  --
 
diff --git a/regress/case-comprinf.err b/regress/case-comprinf.err
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/regress/case-comprinf.out b/regress/case-comprinf.out
new file mode 100644 (file)
index 0000000..b7ea5e8
--- /dev/null
@@ -0,0 +1,4 @@
+adns debug: using nameserver 172.18.45.6
+37.45.18.172.in-addr.arpa. flags 0 type 12 PTR(raw) submitted
+37.45.18.172.in-addr.arpa. flags 0 type PTR(raw): Found overly-long domain name; nrrs=0; cname=37.45.18.172.in-addr.arpa.test.iwj.relativity.greenend.org.uk; owner=$; ttl=60
+rc=0
diff --git a/regress/case-comprinf.sys b/regress/case-comprinf.sys
new file mode 100644 (file)
index 0000000..2064818
--- /dev/null
@@ -0,0 +1,35 @@
+default
+:12 37.45.18.172.in-addr.arpa.
+ start 951961094.184850
+ socket type=SOCK_DGRAM
+ socket=4
+ +0.000134
+ fcntl fd=4 cmd=F_GETFL
+ fcntl=~O_NONBLOCK&...
+ +0.000053
+ fcntl fd=4 cmd=F_SETFL O_NONBLOCK|...
+ fcntl=OK
+ +0.000035
+ sendto fd=4 addr=172.18.45.6:53
+     311f0100 00010000 00000000 02333702 34350231 38033137 3207696e 2d616464
+     72046172 70610000 0c0001.
+ sendto=43
+ +0.000960
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.999040
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.000200
+ recvfrom fd=4 buflen=512 *addrlen=16
+ recvfrom=OK addr=172.18.45.6:53
+     311f8580 00010002 00010001 02333702 34350231 38033137 3207696e 2d616464
+     72046172 70610000 0c0001c0 0c000500 01000151 80003f02 33370234 35023138
+     03313732 07696e2d 61646472 04617270 61047465 73740369 776a0a72 656c6174
+     69766974 79086772 65656e65 6e64036f 72670275 6b00c037 000c0001 0000003c
+     00060370 7472c082 c0510002 00010000 003c0006 036e7330 c05ac094 00010001
+     00015180 0004ac12 2d06.
+ +0.000624
+ recvfrom fd=4 buflen=512 *addrlen=16
+ recvfrom=EAGAIN
+ +0.000222
+ close fd=4
+ close=OK
+ +0.000197
index 4fc7d7f342c0e2ba8c86c3360ca15d12e33aaf8c..643b86f00ad18eb0b0b4ab52791bcc8ef33e010f 100644 (file)
@@ -58,6 +58,7 @@ typedef unsigned char byte;
 
 #define DNS_PORT 53
 #define DNS_MAXUDP 512
+#define DNS_MAXLABEL 63
 #define DNS_MAXDOMAIN 255
 #define DNS_HDRSIZE 12
 #define DNS_IDOFFSET 0
index b97ffc65a59a04c724b28bde12a6cd5b1b1baf0a..8151d6ced5df8f29b15aea6cbad663f87cc0844d 100644 (file)
@@ -115,9 +115,9 @@ adns_status adns__mkquery(adns_state ads, vbuf *vb, int *id_r,
       label[ll++]= c;
     }
     if (!ll) return adns_s_querydomaininvalid;
-    if (ll > 63) return adns_s_querydomaintoolong;
+    if (ll > DNS_MAXLABEL) return adns_s_querydomaintoolong;
     nbytes+= ll+1;
-    if (nbytes > 254) return adns_s_querydomaintoolong;
+    if (nbytes >= DNS_MAXDOMAIN) return adns_s_querydomaintoolong;
     MKQUERY_ADDB(ll);
     memcpy(rqp,label,ll); rqp+= ll;
   }