## page was renamed from DNS/実装/djbdns/tinydns/tdlookup-patch/zone-apex-cname DNS/実装/djbdns/tinydns/tdlookup-patch/zone-apex-cnameについて、ここに記述してください。 現状のtdlookup.cのCNAMEの扱いには問題がある。  他タイプとのCNAMEタイプ同居にはまったく配慮されていない。   CNAMEレコードがあると、常にAnswerに返される。 RFCではやらないようにという指示があるので、やる側の責任だというのにも一理あるが。 ここではRFC 1034にあるように、 検索要求タイプに一致しなかった場合にのみ、CNAMEレコードの有無を調べるという動作をさせてみた。 これなら、zone apexに対するAレコードがない場合にCNAMEが返されるという動作をして、 望ましい結果を得られる。 -- ToshinoriMaeno <> {{{ %diff -c tdlookup.c-12-08 tdlookup.c-12-08-2 *** tdlookup.c-12-08 2015-12-08 13:54:56.000000000 +0900 --- tdlookup.c-12-08-2 2015-12-08 14:39:27.000000000 +0900 *************** *** 157,165 **** cdb_findstart(&c); while (r = find(wild,wild != q)) { if (r == -1) return 0; ! flagfound = 1; if (flaggavesoa && byte_equal(type,2,DNS_T_SOA)) continue; ! if (byte_diff(type,2,qtype) && byte_diff(type,2,DNS_T_CNAME)) continue; if (byte_equal(type,2,DNS_T_A) && (dlen - dpos == 4)) { addrttl = ttl; i = dns_random(addrnum + 1); --- 157,166 ---- cdb_findstart(&c); while (r = find(wild,wild != q)) { if (r == -1) return 0; ! if (!flagfound) flagfound = 1; if (flaggavesoa && byte_equal(type,2,DNS_T_SOA)) continue; ! if (byte_diff(type,2,qtype)) continue; ! flagfound = 2; if (byte_equal(type,2,DNS_T_A) && (dlen - dpos == 4)) { addrttl = ttl; i = dns_random(addrnum + 1); *************** *** 172,178 **** 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; } else if (byte_equal(type,2,DNS_T_MX)) { --- 173,179 ---- continue; } if (!response_rstart(q,type,ttl)) return 0; ! 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_MX)) { *************** *** 203,212 **** wild += 1; } ! if (!flagfound) { response_nxdomain(); clientloc[0]='v'; clientloc[1]='v'; ! } AUTHORITY: aupos = response_len; --- 204,225 ---- wild += 1; } ! if (flagfound == 1) { /* no qtype found */ ! cdb_findstart(&c); /* look for CNAME */ ! while (r = find(wild,wild != q)) { ! if (r == -1) return 0; ! if (byte_diff(type,2,DNS_T_CNAME)) continue; ! if (!response_rstart(q,type,ttl)) return 0; ! if (!doname()) return 0; ! flagfound =2; ! } ! if (flagfound == 2) response_rfinish(RESPONSE_ANSWER); ! } ! else if (!flagfound) { response_nxdomain(); clientloc[0]='v'; clientloc[1]='v'; ! } ! AUTHORITY: aupos = response_len; }}} while loop 内にresponse_rstart があるのはまずいかも。  cname が 2個あった場合のことを忘れていそうだ。 -- ToshinoriMaeno <>