From: ian Date: Thu, 2 Mar 2000 01:45:37 +0000 (+0000) Subject: + * Add test case for recursion (infinite loop) domain compression. X-Git-Tag: rel-adns-0-7~3 X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~mdw/git/adns/commitdiff_plain/5b9dd636d9afe29576a0da94a5cdfe227f3a6853?hp=2b1c6979bb36a0e3a5aaa7f18b0c72b528f886b9 + * Add test case for recursion (infinite loop) domain compression. @@ -9,6 +9,7 @@ + * Add test case for recursion (infinite loop) domain compression. --- diff --git a/changelog b/changelog index 942f20b..16580a6 100644 --- 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 index 0000000..e69de29 diff --git a/regress/case-comprinf.out b/regress/case-comprinf.out new file mode 100644 index 0000000..b7ea5e8 --- /dev/null +++ b/regress/case-comprinf.out @@ -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 index 0000000..2064818 --- /dev/null +++ b/regress/case-comprinf.sys @@ -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 diff --git a/src/internal.h b/src/internal.h index 4fc7d7f..643b86f 100644 --- a/src/internal.h +++ b/src/internal.h @@ -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 diff --git a/src/transmit.c b/src/transmit.c index b97ffc6..8151d6c 100644 --- a/src/transmit.c +++ b/src/transmit.c @@ -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; }