From c44d8b51ffb5a413f8bbdbd9991bbc573853e397 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henryk=20Pl=C3=B6tz?= Date: Fri, 3 Oct 2014 20:04:14 +0200 Subject: Apply patch djbdns-1.05-test27.diff.bz2 Source was http://www.fefe.de/dns/djbdns-1.05-test27.diff.bz2, SHA1 f0380ec1866f49c0bcf6369a923ac0a4a5095da8 --- tdlookup.c | 53 +++++++++++++++++++++++++++++++++-------------------- 1 file changed, 33 insertions(+), 20 deletions(-) (limited to 'tdlookup.c') diff --git a/tdlookup.c b/tdlookup.c index da7420d..b760340 100644 --- a/tdlookup.c +++ b/tdlookup.c @@ -8,6 +8,8 @@ #include "dns.h" #include "seek.h" #include "response.h" +#include "ip6.h" +#include "clientloc.h" static int want(const char *owner,const char type[2]) { @@ -61,7 +63,7 @@ static int find(char *d,int flagwild) if (cdb_read(&c,data,dlen,cdb_datapos(&c)) == -1) return -1; dpos = dns_packet_copy(data,dlen,0,type,2); if (!dpos) return -1; dpos = dns_packet_copy(data,dlen,dpos,&ch,1); if (!dpos) return -1; - if ((ch == '=' + 1) || (ch == '*' + 1)) { + if ((ch == '=' + 1) || (ch == '*' + 1) || (ch == '6' + 1)) { --ch; dpos = dns_packet_copy(data,dlen,dpos,recordloc,2); if (!dpos) return -1; if (byte_diff(recordloc,2,clientloc)) continue; @@ -119,8 +121,9 @@ static int doit(char *q,char qtype[2]) char x[20]; uint16 u16; char addr[8][4]; - int addrnum; - uint32 addrttl; + char addr6[8][16]; + int addrnum,addr6num; + uint32 addrttl,addr6ttl; int i; anpos = response_len; @@ -152,8 +155,8 @@ static int doit(char *q,char qtype[2]) wild = q; for (;;) { - addrnum = 0; - addrttl = 0; + addrnum = addr6num = 0; + addrttl = addr6ttl = 0; cdb_findstart(&c); while (r = find(wild,wild != q)) { if (r == -1) return 0; @@ -171,6 +174,17 @@ static int doit(char *q,char qtype[2]) if (addrnum < 1000000) ++addrnum; continue; } + if (byte_equal(type,2,DNS_T_AAAA) && (dlen - dpos == 16)) { + addr6ttl = ttl; + i = dns_random(addr6num + 1); + if (i < 8) { + if ((i < addr6num) && (addr6num < 8)) + byte_copy(addr6[addr6num],16,addr6[i]); + byte_copy(addr6[i],16,data + dpos); + } + if (addr6num < 1000000) ++addr6num; + 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 (!doname()) return 0; @@ -195,6 +209,12 @@ static int doit(char *q,char qtype[2]) if (!response_addbytes(addr[i],4)) return 0; response_rfinish(RESPONSE_ANSWER); } + for (i = 0;i < addr6num;++i) + if (i < 8) { + if (!response_rstart(q,DNS_T_AAAA,addr6ttl)) return 0; + if (!response_addbytes(addr6[i],16)) return 0; + response_rfinish(RESPONSE_ANSWER); + } if (flagfound) break; if (wild == control) break; @@ -259,6 +279,11 @@ static int doit(char *q,char qtype[2]) if (!dobytes(4)) return 0; response_rfinish(RESPONSE_ADDITIONAL); } + else if (byte_equal(type,2,DNS_T_AAAA)) { + if (!response_rstart(d1,DNS_T_AAAA,ttl)) return 0; + if (!dobytes(16)) return 0; + response_rfinish(RESPONSE_ADDITIONAL); + } } } } @@ -278,30 +303,18 @@ static int doit(char *q,char qtype[2]) return 1; } -int respond(char *q,char qtype[2],char ip[4]) +int respond(char *q,char qtype[2],char ip[16]) { int fd; int r; - char key[6]; + + find_client_loc(clientloc, ip); tai_now(&now); fd = open_read("data.cdb"); if (fd == -1) return 0; cdb_init(&c,fd); - byte_zero(clientloc,2); - key[0] = 0; - key[1] = '%'; - byte_copy(key + 2,4,ip); - r = cdb_find(&c,key,6); - if (!r) r = cdb_find(&c,key,5); - if (!r) r = cdb_find(&c,key,4); - if (!r) r = cdb_find(&c,key,3); - if (!r) r = cdb_find(&c,key,2); - if (r == -1) return 0; - if (r && (cdb_datalen(&c) == 2)) - if (cdb_read(&c,clientloc,2,cdb_datapos(&c)) == -1) return 0; - r = doit(q,qtype); cdb_free(&c); -- cgit v1.2.3