DNS/実装/djbdns/tinydns/tdlookup-patch/zone-apex-cnameについて、ここに記述してください。

現状のtdlookup.cのCNAMEの扱いには問題がある。

ここではRFC 1034にあるように、

これなら、zone apexに対するAレコードがない場合にCNAMEが返されるという動作をして、 望ましい結果を得られる。

-- ToshinoriMaeno 2015-12-08 10:04:35

%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 があるのはまずいかも。

-- ToshinoriMaeno 2017-02-24 07:48:14

MoinQ: djbdns/tinydns/tdlookup-patch/zone-apex-cname (last edited 2021-05-20 14:37:52 by ToshinoriMaeno)