## page was renamed from djbdns/dnscache/query.c-patch ## page was renamed from DNS/実装/djbdns/dnscache/query.c-patch ## page was renamed from f.ns.qmail.jp/dnscache = dnscache /query.c patch = <> == additional section handling == in domain ではないAレコードは無視する。-- ToshinoriMaeno <> {{{ *** query.c.2021-521 2021-05-21 19:27:07.538163060 +0900 --- query.c 2021-05-21 20:00:19.683215972 +0900 *************** *** 649,654 **** --- 649,655 ---- save_finish(DNS_T_MX,t1,ttl); } else if (byte_equal(type,2,DNS_T_A)) { + if (!dns_domain_suffix(d, t1)) { i = j; continue; } save_start(); while (i < j) { pos = dns_packet_skipname(buf,len,records[i]); if (!pos) goto DIE; }}} == answer section あり == answer section があったときには、authority, additional は無視する。 %diff -c query.c* ~/djb/djbdns-1.05 {{{ *** query.c 2012-04-24 09:49:32.000000000 +0900 --- query.c.orig 2012-04-24 09:49:35.000000000 +0900 *************** *** 525,532 **** if (records) { alloc_free(records); records = 0; } ! k = numanswers; ! if (k==0) k = numauthority + numglue; records = (unsigned int *) alloc(k * sizeof(unsigned int)); if (!records) goto DIE; --- 525,532 ---- if (records) { alloc_free(records); records = 0; } ! ! k = numanswers + numauthority + numglue; records = (unsigned int *) alloc(k * sizeof(unsigned int)); if (!records) goto DIE; }}} == TTLを制限する == 2021年現在ではもっと短くてもよさそう。3時間くらいではどうか。-- ToshinoriMaeno <> %diff -c cache.c* ~/djb/djbdns-1.05 {{{ *** cache.c 2012-06-01 08:50:12.000000000 +0900 --- cache.c.orig 2012-04-24 09:49:35.000000000 +0900 *************** *** 137,144 **** if (datalen > MAXDATALEN) return; if (!ttl) return; ! if (ttl > 86400) ttl = 86400; ! if (ttl < 600) ttl = 600; entrylen = keylen + datalen + 20; --- 137,143 ---- if (datalen > MAXDATALEN) return; if (!ttl) return; ! if (ttl > 604800) ttl = 604800; entrylen = keylen + datalen + 20; }}} == port 番号 == port 番号を取り出すための修正 %diff -c server.c* ~/djb/djbdns-1.05 {{{ *** server.c 2012-04-24 09:49:32.000000000 +0900 --- server.c.orig 2012-04-24 09:49:35.000000000 +0900 *************** *** 14,20 **** extern char *fatal; extern char *starting; ! extern int respond(char *,char *,char *, uint16); extern void initialize(void); static char ip[4]; --- 14,20 ---- extern char *fatal; extern char *starting; ! extern int respond(char *,char *,char *); extern void initialize(void); static char ip[4]; *************** *** 55,61 **** if (byte_equal(qtype,2,DNS_T_AXFR)) goto NOTIMP; case_lowerb(q,dns_domain_length(q)); ! if (!respond(q,qtype,ip, port)) { qlog(ip,port,header,q,qtype," - "); return 0; } --- 55,61 ---- if (byte_equal(qtype,2,DNS_T_AXFR)) goto NOTIMP; case_lowerb(q,dns_domain_length(q)); ! if (!respond(q,qtype,ip)) { qlog(ip,port,header,q,qtype," - "); return 0; } }}} == fixed query port alert == 問い合わせポート固定のquery には返答を変えて返事をする。(cdbに渡すパラメタフラグの変更) %diff -c tdlookup.c tdlookup.c.orig ~/djb/djbdns-1.05 {{{ *** tdlookup.c 2012-10-27 22:32:17.000000000 +0900 --- tdlookup.c.orig 2012-04-24 09:49:35.000000000 +0900 *************** *** 225,231 **** } } else ! if ((anpos == response_len) && want(control,DNS_T_NS)) { cdb_findstart(&c); while (r = find(control,0)) { if (r == -1) return 0; --- 225,231 ---- } } else ! if (want(control,DNS_T_NS)) { cdb_findstart(&c); while (r = find(control,0)) { if (r == -1) return 0; *************** *** 278,284 **** return 1; } ! int respond(char *q,char qtype[2],char ip[4], uint16 srcport) { int fd; int r; --- 278,284 ---- return 1; } ! int respond(char *q,char qtype[2],char ip[4]) { int fd; int r; *************** *** 302,312 **** if (r && (cdb_datalen(&c) == 2)) if (cdb_read(&c,clientloc,2,cdb_datapos(&c)) == -1) return 0; ! if (srcport < 1040 || (srcport > 32767 && srcport < 32784)) { ! clientloc[0]='v'; clientloc[1]='v'; ! } ! if (srcport != 53) ! r = doit(q,qtype); cdb_free(&c); close(fd); --- 302,308 ---- 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); close(fd); }}}