djbdns/240-tinydns-alias-chain-truncation.patch

88 lines
2.1 KiB
Diff
Raw Permalink Normal View History

--- a/tdlookup.c
+++ b/tdlookup.c
@@ -103,12 +103,13 @@ static int doname(void)
return response_addname(d1);
}
-static int doit(char *q,char qtype[2])
+static int doit1(char **pqname,char qtype[2])
{
unsigned int bpos;
unsigned int anpos;
unsigned int aupos;
unsigned int arpos;
+ char *q;
char *control;
char *wild;
int flaggavesoa;
@@ -122,6 +123,12 @@ static int doit(char *q,char qtype[2])
int addrnum;
uint32 addrttl;
int i;
+ int loop = 0 ;
+
+RESTART:
+ if (loop++ >= 100) return 0 ;
+
+ q = *pqname ;
anpos = response_len;
@@ -136,7 +143,14 @@ static int doit(char *q,char qtype[2])
if (byte_equal(type,2,DNS_T_NS)) flagns = 1;
}
if (flagns) break;
- if (!*control) return 0; /* q is not within our bailiwick */
+ if (!*control) { /* q is not within our bailiwick */
+ if (loop <= 1)
+ return 0 ;
+ else {
+ response[2] &= ~4;
+ goto DONE; /* The administrator has issued contradictory instructions */
+ }
+ }
control += *control;
control += 1;
}
@@ -172,9 +186,17 @@ static int doit(char *q,char qtype[2])
continue;
}
if (!response_rstart(q,type,ttl)) return 0;
- if (byte_equal(type,2,DNS_T_NS) || byte_equal(type,2,DNS_T_CNAME) || byte_equal(type,2,DNS_T_PTR)) {
+ if (byte_equal(type,2,DNS_T_NS) || byte_equal(type,2,DNS_T_PTR)) {
if (!doname()) return 0;
}
+ else if (byte_equal(type,2,DNS_T_CNAME)) {
+ if (!doname()) return 0;
+ if (byte_diff(type,2,qtype)) {
+ response_rfinish(RESPONSE_ANSWER);
+ if (!dns_domain_copy(pqname,d1)) return 0 ;
+ goto RESTART ;
+ }
+ }
else if (byte_equal(type,2,DNS_T_MX)) {
if (!dobytes(2)) return 0;
if (!doname()) return 0;
@@ -275,9 +297,21 @@ static int doit(char *q,char qtype[2])
}
}
+DONE:
return 1;
}
+static int doit(char *qname,char qtype[2])
+{
+ int r ;
+ char * q = 0 ;
+
+ if (!dns_domain_copy(&q, qname)) return 0 ;
+ r = doit1(&q, qtype) ;
+ dns_domain_free(&q) ;
+ return r ;
+}
+
int respond(char *q,char qtype[2],char ip[4])
{
static struct tai cdb_valid = { 0 };