diet-djbdns-dnscache-cname-handling.patch
author Tomas Zeman <tzeman@volny.cz>
Tue, 02 Jul 2013 09:44:50 +0200
changeset 147 761da690b72c
parent 135 92afa092bd07
permissions -rw-r--r--
phpmyadmin.patch: 3.5.5 -> 4.0.4.1
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
134
a78e58de5a7e diet-djbdns-dnscache-cname-handling.patch: patching djbdns
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
     1
# HG changeset patch
a78e58de5a7e diet-djbdns-dnscache-cname-handling.patch: patching djbdns
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
     2
# Parent 847c22ddbdd92b4a49325912c5bb7c075b0350e3
a78e58de5a7e diet-djbdns-dnscache-cname-handling.patch: patching djbdns
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
     3
dnscache CNAME handling
a78e58de5a7e diet-djbdns-dnscache-cname-handling.patch: patching djbdns
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
     4
a78e58de5a7e diet-djbdns-dnscache-cname-handling.patch: patching djbdns
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
     5
diff -r 847c22ddbdd9 source/dietlibc/diet-djbdns/FrugalBuild
a78e58de5a7e diet-djbdns-dnscache-cname-handling.patch: patching djbdns
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
     6
--- a/source/dietlibc/diet-djbdns/FrugalBuild	Fri Feb 17 10:25:48 2012 +0100
135
92afa092bd07 diet-djbdns-dnscache-cname-handling.patch: sha1sums fixed
Tomas Zeman <tzeman@volny.cz>
parents: 134
diff changeset
     7
+++ b/source/dietlibc/diet-djbdns/FrugalBuild	Fri Feb 17 10:48:29 2012 +0100
134
a78e58de5a7e diet-djbdns-dnscache-cname-handling.patch: patching djbdns
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
     8
@@ -4,7 +4,7 @@
a78e58de5a7e diet-djbdns-dnscache-cname-handling.patch: patching djbdns
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
     9
 pkgorig=djbdns
a78e58de5a7e diet-djbdns-dnscache-cname-handling.patch: patching djbdns
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    10
 pkgname=$branch-$pkgorig
a78e58de5a7e diet-djbdns-dnscache-cname-handling.patch: patching djbdns
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    11
 pkgver=1.05
a78e58de5a7e diet-djbdns-dnscache-cname-handling.patch: patching djbdns
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    12
-pkgrel=3
a78e58de5a7e diet-djbdns-dnscache-cname-handling.patch: patching djbdns
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    13
+pkgrel=4
a78e58de5a7e diet-djbdns-dnscache-cname-handling.patch: patching djbdns
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    14
 pkgdesc="High-performant & secure DNS services."
a78e58de5a7e diet-djbdns-dnscache-cname-handling.patch: patching djbdns
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    15
 url="http://cr.yp.to/djbdns.html"
a78e58de5a7e diet-djbdns-dnscache-cname-handling.patch: patching djbdns
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    16
 archs=(i686)
135
92afa092bd07 diet-djbdns-dnscache-cname-handling.patch: sha1sums fixed
Tomas Zeman <tzeman@volny.cz>
parents: 134
diff changeset
    17
@@ -13,12 +13,15 @@
134
a78e58de5a7e diet-djbdns-dnscache-cname-handling.patch: patching djbdns
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    18
 makedepends=(dietlibc)
a78e58de5a7e diet-djbdns-dnscache-cname-handling.patch: patching djbdns
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    19
 install="$pkgorig.install"
a78e58de5a7e diet-djbdns-dnscache-cname-handling.patch: patching djbdns
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    20
 backup=(etc/dnsroots.global)
a78e58de5a7e diet-djbdns-dnscache-cname-handling.patch: patching djbdns
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    21
-source=(http://cr.yp.to/$pkgorig/$pkgorig-$pkgver.tar.gz)
135
92afa092bd07 diet-djbdns-dnscache-cname-handling.patch: sha1sums fixed
Tomas Zeman <tzeman@volny.cz>
parents: 134
diff changeset
    22
-sha1sums=('2efdb3a039d0c548f40936aa9cb30829e0ce8c3d')
134
a78e58de5a7e diet-djbdns-dnscache-cname-handling.patch: patching djbdns
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    23
+source=(http://cr.yp.to/$pkgorig/$pkgorig-$pkgver.tar.gz \
a78e58de5a7e diet-djbdns-dnscache-cname-handling.patch: patching djbdns
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    24
+	dnscache-cname-handling.patch)
135
92afa092bd07 diet-djbdns-dnscache-cname-handling.patch: sha1sums fixed
Tomas Zeman <tzeman@volny.cz>
parents: 134
diff changeset
    25
+sha1sums=('2efdb3a039d0c548f40936aa9cb30829e0ce8c3d' \
92afa092bd07 diet-djbdns-dnscache-cname-handling.patch: sha1sums fixed
Tomas Zeman <tzeman@volny.cz>
parents: 134
diff changeset
    26
+          'bbfa9b12aa298268a8da07ef6de279883c15893e')
134
a78e58de5a7e diet-djbdns-dnscache-cname-handling.patch: patching djbdns
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    27
 provides=(djbdns)
a78e58de5a7e diet-djbdns-dnscache-cname-handling.patch: patching djbdns
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    28
 
a78e58de5a7e diet-djbdns-dnscache-cname-handling.patch: patching djbdns
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    29
 build() {
a78e58de5a7e diet-djbdns-dnscache-cname-handling.patch: patching djbdns
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    30
 	Fcd $pkgorig-$pkgver
a78e58de5a7e diet-djbdns-dnscache-cname-handling.patch: patching djbdns
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    31
+	Fpatchall
a78e58de5a7e diet-djbdns-dnscache-cname-handling.patch: patching djbdns
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    32
 	echo "diet gcc ${CFLAGS}" > conf-cc
a78e58de5a7e diet-djbdns-dnscache-cname-handling.patch: patching djbdns
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    33
 	echo "diet gcc -s -static" > conf-ld
a78e58de5a7e diet-djbdns-dnscache-cname-handling.patch: patching djbdns
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    34
 	echo "/usr" > conf-home
a78e58de5a7e diet-djbdns-dnscache-cname-handling.patch: patching djbdns
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    35
diff -r 847c22ddbdd9 source/dietlibc/diet-djbdns/dnscache-cname-handling.patch
a78e58de5a7e diet-djbdns-dnscache-cname-handling.patch: patching djbdns
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    36
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
135
92afa092bd07 diet-djbdns-dnscache-cname-handling.patch: sha1sums fixed
Tomas Zeman <tzeman@volny.cz>
parents: 134
diff changeset
    37
+++ b/source/dietlibc/diet-djbdns/dnscache-cname-handling.patch	Fri Feb 17 10:48:29 2012 +0100
134
a78e58de5a7e diet-djbdns-dnscache-cname-handling.patch: patching djbdns
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    38
@@ -0,0 +1,256 @@
a78e58de5a7e diet-djbdns-dnscache-cname-handling.patch: patching djbdns
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    39
+http://homepage.ntlworld.com/jonathan.deboynepollard/Softwares/djbdns/dnscache-cname-handling.patch
a78e58de5a7e diet-djbdns-dnscache-cname-handling.patch: patching djbdns
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    40
+http://homepage.ntlworld.com/jonathan.deboynepollard/Softwares/djbdns/
a78e58de5a7e diet-djbdns-dnscache-cname-handling.patch: patching djbdns
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    41
+
a78e58de5a7e diet-djbdns-dnscache-cname-handling.patch: patching djbdns
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    42
+Making dnscache handle client-side aliases ("CNAME" records) correctly
a78e58de5a7e diet-djbdns-dnscache-cname-handling.patch: patching djbdns
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    43
+
a78e58de5a7e diet-djbdns-dnscache-cname-handling.patch: patching djbdns
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    44
+There are several problems with the way that dnscache handles client-side
a78e58de5a7e diet-djbdns-dnscache-cname-handling.patch: patching djbdns
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    45
+aliases, that become acutely apparent if one patches qmail to remove the
a78e58de5a7e diet-djbdns-dnscache-cname-handling.patch: patching djbdns
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    46
+workaround for a BIND version 4 problem. This patch modifies the behaviour of
a78e58de5a7e diet-djbdns-dnscache-cname-handling.patch: patching djbdns
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    47
+dnscache, to correct them, in the following ways:
a78e58de5a7e diet-djbdns-dnscache-cname-handling.patch: patching djbdns
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    48
+
a78e58de5a7e diet-djbdns-dnscache-cname-handling.patch: patching djbdns
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    49
+dnscache will cache "CNAME" resource record sets (both empty and non-empty).
a78e58de5a7e diet-djbdns-dnscache-cname-handling.patch: patching djbdns
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    50
+
a78e58de5a7e diet-djbdns-dnscache-cname-handling.patch: patching djbdns
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    51
+dnscache will correctly ignore a cached "CNAME" resource record set that
a78e58de5a7e diet-djbdns-dnscache-cname-handling.patch: patching djbdns
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    52
+happens to be empty (which will result if an explicit "CNAME" query is made
a78e58de5a7e diet-djbdns-dnscache-cname-handling.patch: patching djbdns
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    53
+against a domain name that has no client-side aliases).
a78e58de5a7e diet-djbdns-dnscache-cname-handling.patch: patching djbdns
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    54
+
a78e58de5a7e diet-djbdns-dnscache-cname-handling.patch: patching djbdns
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    55
+dnscache will notice lame servers where the lame delegation is present at the
a78e58de5a7e diet-djbdns-dnscache-cname-handling.patch: patching djbdns
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    56
+end of a chain of client-side aliases. Any instances of tinydns that have not
a78e58de5a7e diet-djbdns-dnscache-cname-handling.patch: patching djbdns
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    57
+been patched to make them publish whole alias chains instead of just the first
a78e58de5a7e diet-djbdns-dnscache-cname-handling.patch: patching djbdns
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    58
+links will thus be logged as "lame".
a78e58de5a7e diet-djbdns-dnscache-cname-handling.patch: patching djbdns
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    59
+
a78e58de5a7e diet-djbdns-dnscache-cname-handling.patch: patching djbdns
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    60
+dnscache will not issue redundant queries if it can follow an entire
a78e58de5a7e diet-djbdns-dnscache-cname-handling.patch: patching djbdns
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    61
+client-side alias chain to the end using the information that it already has in
a78e58de5a7e diet-djbdns-dnscache-cname-handling.patch: patching djbdns
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    62
+a response.
a78e58de5a7e diet-djbdns-dnscache-cname-handling.patch: patching djbdns
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    63
+
a78e58de5a7e diet-djbdns-dnscache-cname-handling.patch: patching djbdns
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    64
+dnscache will cache any in-bailiwick information that it receives from lame
a78e58de5a7e diet-djbdns-dnscache-cname-handling.patch: patching djbdns
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    65
+servers. Any in-bailiwick client-side alias information and delegation
a78e58de5a7e diet-djbdns-dnscache-cname-handling.patch: patching djbdns
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    66
+information that are received from an otherwise "lame" server will no longer be
a78e58de5a7e diet-djbdns-dnscache-cname-handling.patch: patching djbdns
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    67
+thrown away along with the bath-water.
a78e58de5a7e diet-djbdns-dnscache-cname-handling.patch: patching djbdns
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    68
+
a78e58de5a7e diet-djbdns-dnscache-cname-handling.patch: patching djbdns
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    69
+--- djbdns-1.05-original/query.c	Sun Feb 11 21:11:45 2001
a78e58de5a7e diet-djbdns-dnscache-cname-handling.patch: patching djbdns
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    70
++++ djbdns-1.05/query.c	Wed Mar 26 15:48:20 2003
a78e58de5a7e diet-djbdns-dnscache-cname-handling.patch: patching djbdns
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    71
+@@ -91,6 +91,21 @@
a78e58de5a7e diet-djbdns-dnscache-cname-handling.patch: patching djbdns
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    72
+   }
a78e58de5a7e diet-djbdns-dnscache-cname-handling.patch: patching djbdns
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    73
+ }
a78e58de5a7e diet-djbdns-dnscache-cname-handling.patch: patching djbdns
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    74
+ 
a78e58de5a7e diet-djbdns-dnscache-cname-handling.patch: patching djbdns
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    75
++static int move_name_to_alias(struct query *z,uint32 ttl)
a78e58de5a7e diet-djbdns-dnscache-cname-handling.patch: patching djbdns
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    76
++{
a78e58de5a7e diet-djbdns-dnscache-cname-handling.patch: patching djbdns
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    77
++  int j ;
a78e58de5a7e diet-djbdns-dnscache-cname-handling.patch: patching djbdns
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    78
++
a78e58de5a7e diet-djbdns-dnscache-cname-handling.patch: patching djbdns
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    79
++  if (z->alias[QUERY_MAXALIAS - 1]) return 0 ;
a78e58de5a7e diet-djbdns-dnscache-cname-handling.patch: patching djbdns
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    80
++  for (j = QUERY_MAXALIAS - 1;j > 0;--j)
a78e58de5a7e diet-djbdns-dnscache-cname-handling.patch: patching djbdns
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    81
++    z->alias[j] = z->alias[j - 1];
a78e58de5a7e diet-djbdns-dnscache-cname-handling.patch: patching djbdns
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    82
++  for (j = QUERY_MAXALIAS - 1;j > 0;--j)
a78e58de5a7e diet-djbdns-dnscache-cname-handling.patch: patching djbdns
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    83
++    z->aliasttl[j] = z->aliasttl[j - 1];
a78e58de5a7e diet-djbdns-dnscache-cname-handling.patch: patching djbdns
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    84
++  z->alias[0] = z->name[0];
a78e58de5a7e diet-djbdns-dnscache-cname-handling.patch: patching djbdns
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    85
++  z->aliasttl[0] = ttl;
a78e58de5a7e diet-djbdns-dnscache-cname-handling.patch: patching djbdns
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    86
++  z->name[0] = 0;
a78e58de5a7e diet-djbdns-dnscache-cname-handling.patch: patching djbdns
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    87
++  return 1 ;
a78e58de5a7e diet-djbdns-dnscache-cname-handling.patch: patching djbdns
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    88
++}
a78e58de5a7e diet-djbdns-dnscache-cname-handling.patch: patching djbdns
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    89
++
a78e58de5a7e diet-djbdns-dnscache-cname-handling.patch: patching djbdns
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    90
+ static int rqa(struct query *z)
a78e58de5a7e diet-djbdns-dnscache-cname-handling.patch: patching djbdns
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    91
+ {
a78e58de5a7e diet-djbdns-dnscache-cname-handling.patch: patching djbdns
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    92
+   int i;
a78e58de5a7e diet-djbdns-dnscache-cname-handling.patch: patching djbdns
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    93
+@@ -123,7 +138,6 @@
a78e58de5a7e diet-djbdns-dnscache-cname-handling.patch: patching djbdns
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    94
+ static char *t1 = 0;
a78e58de5a7e diet-djbdns-dnscache-cname-handling.patch: patching djbdns
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    95
+ static char *t2 = 0;
a78e58de5a7e diet-djbdns-dnscache-cname-handling.patch: patching djbdns
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    96
+ static char *t3 = 0;
a78e58de5a7e diet-djbdns-dnscache-cname-handling.patch: patching djbdns
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    97
+-static char *cname = 0;
a78e58de5a7e diet-djbdns-dnscache-cname-handling.patch: patching djbdns
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    98
+ static char *referral = 0;
a78e58de5a7e diet-djbdns-dnscache-cname-handling.patch: patching djbdns
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    99
+ static unsigned int *records = 0;
a78e58de5a7e diet-djbdns-dnscache-cname-handling.patch: patching djbdns
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   100
+ 
a78e58de5a7e diet-djbdns-dnscache-cname-handling.patch: patching djbdns
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   101
+@@ -179,15 +193,14 @@
a78e58de5a7e diet-djbdns-dnscache-cname-handling.patch: patching djbdns
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   102
+   uint16 datalen;
a78e58de5a7e diet-djbdns-dnscache-cname-handling.patch: patching djbdns
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   103
+   char *control;
a78e58de5a7e diet-djbdns-dnscache-cname-handling.patch: patching djbdns
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   104
+   char *d;
a78e58de5a7e diet-djbdns-dnscache-cname-handling.patch: patching djbdns
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   105
++  char *owner_name = 0 ;
a78e58de5a7e diet-djbdns-dnscache-cname-handling.patch: patching djbdns
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   106
+   const char *dtype;
a78e58de5a7e diet-djbdns-dnscache-cname-handling.patch: patching djbdns
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   107
+   unsigned int dlen;
a78e58de5a7e diet-djbdns-dnscache-cname-handling.patch: patching djbdns
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   108
+   int flagout;
a78e58de5a7e diet-djbdns-dnscache-cname-handling.patch: patching djbdns
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   109
+-  int flagcname;
a78e58de5a7e diet-djbdns-dnscache-cname-handling.patch: patching djbdns
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   110
+   int flagreferral;
a78e58de5a7e diet-djbdns-dnscache-cname-handling.patch: patching djbdns
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   111
+   int flagsoa;
a78e58de5a7e diet-djbdns-dnscache-cname-handling.patch: patching djbdns
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   112
+   uint32 ttl;
a78e58de5a7e diet-djbdns-dnscache-cname-handling.patch: patching djbdns
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   113
+   uint32 soattl;
a78e58de5a7e diet-djbdns-dnscache-cname-handling.patch: patching djbdns
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   114
+-  uint32 cnamettl;
a78e58de5a7e diet-djbdns-dnscache-cname-handling.patch: patching djbdns
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   115
+   int i;
a78e58de5a7e diet-djbdns-dnscache-cname-handling.patch: patching djbdns
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   116
+   int j;
a78e58de5a7e diet-djbdns-dnscache-cname-handling.patch: patching djbdns
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   117
+   int k;
a78e58de5a7e diet-djbdns-dnscache-cname-handling.patch: patching djbdns
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   118
+@@ -252,7 +265,10 @@
a78e58de5a7e diet-djbdns-dnscache-cname-handling.patch: patching djbdns
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   119
+ 
a78e58de5a7e diet-djbdns-dnscache-cname-handling.patch: patching djbdns
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   120
+     byte_copy(key,2,DNS_T_CNAME);
a78e58de5a7e diet-djbdns-dnscache-cname-handling.patch: patching djbdns
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   121
+     cached = cache_get(key,dlen + 2,&cachedlen,&ttl);
a78e58de5a7e diet-djbdns-dnscache-cname-handling.patch: patching djbdns
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   122
+-    if (cached) {
a78e58de5a7e diet-djbdns-dnscache-cname-handling.patch: patching djbdns
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   123
++    /* A previous explicit query might have caused an empty RRSet to have been
a78e58de5a7e diet-djbdns-dnscache-cname-handling.patch: patching djbdns
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   124
++    ** cached.  Take care to ignore such a thing. 
a78e58de5a7e diet-djbdns-dnscache-cname-handling.patch: patching djbdns
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   125
++    */
a78e58de5a7e diet-djbdns-dnscache-cname-handling.patch: patching djbdns
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   126
++    if (cached && cachedlen) {
a78e58de5a7e diet-djbdns-dnscache-cname-handling.patch: patching djbdns
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   127
+       if (typematch(DNS_T_CNAME,dtype)) {
a78e58de5a7e diet-djbdns-dnscache-cname-handling.patch: patching djbdns
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   128
+         log_cachedanswer(d,DNS_T_CNAME);
a78e58de5a7e diet-djbdns-dnscache-cname-handling.patch: patching djbdns
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   129
+         if (!rqa(z)) goto DIE;
a78e58de5a7e diet-djbdns-dnscache-cname-handling.patch: patching djbdns
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   130
+@@ -261,8 +277,11 @@
a78e58de5a7e diet-djbdns-dnscache-cname-handling.patch: patching djbdns
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   131
+ 	return 1;
a78e58de5a7e diet-djbdns-dnscache-cname-handling.patch: patching djbdns
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   132
+       }
a78e58de5a7e diet-djbdns-dnscache-cname-handling.patch: patching djbdns
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   133
+       log_cachedcname(d,cached);
a78e58de5a7e diet-djbdns-dnscache-cname-handling.patch: patching djbdns
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   134
+-      if (!dns_domain_copy(&cname,cached)) goto DIE;
a78e58de5a7e diet-djbdns-dnscache-cname-handling.patch: patching djbdns
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   135
+-      goto CNAME;
a78e58de5a7e diet-djbdns-dnscache-cname-handling.patch: patching djbdns
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   136
++      if (!z->level) {
a78e58de5a7e diet-djbdns-dnscache-cname-handling.patch: patching djbdns
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   137
++	if (!move_name_to_alias(z,ttl)) goto DIE ;
a78e58de5a7e diet-djbdns-dnscache-cname-handling.patch: patching djbdns
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   138
++      }
a78e58de5a7e diet-djbdns-dnscache-cname-handling.patch: patching djbdns
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   139
++      if (!dns_domain_copy(&z->name[z->level],cached)) goto DIE;
a78e58de5a7e diet-djbdns-dnscache-cname-handling.patch: patching djbdns
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   140
++      goto NEWNAME;
a78e58de5a7e diet-djbdns-dnscache-cname-handling.patch: patching djbdns
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   141
+     }
a78e58de5a7e diet-djbdns-dnscache-cname-handling.patch: patching djbdns
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   142
+ 
a78e58de5a7e diet-djbdns-dnscache-cname-handling.patch: patching djbdns
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   143
+     if (typematch(DNS_T_NS,dtype)) {
a78e58de5a7e diet-djbdns-dnscache-cname-handling.patch: patching djbdns
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   144
+@@ -351,7 +370,7 @@
a78e58de5a7e diet-djbdns-dnscache-cname-handling.patch: patching djbdns
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   145
+       }
a78e58de5a7e diet-djbdns-dnscache-cname-handling.patch: patching djbdns
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   146
+     }
a78e58de5a7e diet-djbdns-dnscache-cname-handling.patch: patching djbdns
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   147
+ 
a78e58de5a7e diet-djbdns-dnscache-cname-handling.patch: patching djbdns
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   148
+-    if (!typematch(DNS_T_ANY,dtype) && !typematch(DNS_T_AXFR,dtype) && !typematch(DNS_T_CNAME,dtype) && !typematch(DNS_T_NS,dtype) && !typematch(DNS_T_PTR,dtype) && !typematch(DNS_T_A,dtype) && !typematch(DNS_T_MX,dtype)) {
a78e58de5a7e diet-djbdns-dnscache-cname-handling.patch: patching djbdns
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   149
++    if (!typematch(DNS_T_ANY,dtype) && !typematch(DNS_T_AXFR,dtype) && !typematch(DNS_T_NS,dtype) && !typematch(DNS_T_PTR,dtype) && !typematch(DNS_T_A,dtype) && !typematch(DNS_T_MX,dtype)) {
a78e58de5a7e diet-djbdns-dnscache-cname-handling.patch: patching djbdns
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   150
+       byte_copy(key,2,dtype);
a78e58de5a7e diet-djbdns-dnscache-cname-handling.patch: patching djbdns
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   151
+       cached = cache_get(key,dlen + 2,&cachedlen,&ttl);
a78e58de5a7e diet-djbdns-dnscache-cname-handling.patch: patching djbdns
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   152
+       if (cached && (cachedlen || byte_diff(dtype,2,DNS_T_ANY))) {
a78e58de5a7e diet-djbdns-dnscache-cname-handling.patch: patching djbdns
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   153
+@@ -471,29 +490,31 @@
a78e58de5a7e diet-djbdns-dnscache-cname-handling.patch: patching djbdns
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   154
+   if (rcode && (rcode != 3)) goto DIE; /* impossible; see irrelevant() */
a78e58de5a7e diet-djbdns-dnscache-cname-handling.patch: patching djbdns
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   155
+ 
a78e58de5a7e diet-djbdns-dnscache-cname-handling.patch: patching djbdns
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   156
+   flagout = 0;
a78e58de5a7e diet-djbdns-dnscache-cname-handling.patch: patching djbdns
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   157
+-  flagcname = 0;
a78e58de5a7e diet-djbdns-dnscache-cname-handling.patch: patching djbdns
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   158
+   flagreferral = 0;
a78e58de5a7e diet-djbdns-dnscache-cname-handling.patch: patching djbdns
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   159
+   flagsoa = 0;
a78e58de5a7e diet-djbdns-dnscache-cname-handling.patch: patching djbdns
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   160
+   soattl = 0;
a78e58de5a7e diet-djbdns-dnscache-cname-handling.patch: patching djbdns
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   161
+-  cnamettl = 0;
a78e58de5a7e diet-djbdns-dnscache-cname-handling.patch: patching djbdns
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   162
++  if (!dns_domain_copy(&owner_name,d)) goto DIE;
a78e58de5a7e diet-djbdns-dnscache-cname-handling.patch: patching djbdns
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   163
++  /* This code assumes that the CNAME chain is presented in the correct 
a78e58de5a7e diet-djbdns-dnscache-cname-handling.patch: patching djbdns
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   164
++  ** order.  The example algorithm in RFC 1034 will actually result in this
a78e58de5a7e diet-djbdns-dnscache-cname-handling.patch: patching djbdns
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   165
++  ** being the case, but the words do not require it to be so.
a78e58de5a7e diet-djbdns-dnscache-cname-handling.patch: patching djbdns
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   166
++  */
a78e58de5a7e diet-djbdns-dnscache-cname-handling.patch: patching djbdns
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   167
+   for (j = 0;j < numanswers;++j) {
a78e58de5a7e diet-djbdns-dnscache-cname-handling.patch: patching djbdns
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   168
+     pos = dns_packet_getname(buf,len,pos,&t1); if (!pos) goto DIE;
a78e58de5a7e diet-djbdns-dnscache-cname-handling.patch: patching djbdns
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   169
+     pos = dns_packet_copy(buf,len,pos,header,10); if (!pos) goto DIE;
a78e58de5a7e diet-djbdns-dnscache-cname-handling.patch: patching djbdns
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   170
+ 
a78e58de5a7e diet-djbdns-dnscache-cname-handling.patch: patching djbdns
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   171
+-    if (dns_domain_equal(t1,d))
a78e58de5a7e diet-djbdns-dnscache-cname-handling.patch: patching djbdns
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   172
++    if (dns_domain_equal(t1,owner_name))
a78e58de5a7e diet-djbdns-dnscache-cname-handling.patch: patching djbdns
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   173
+       if (byte_equal(header + 2,2,DNS_C_IN)) { /* should always be true */
a78e58de5a7e diet-djbdns-dnscache-cname-handling.patch: patching djbdns
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   174
+         if (typematch(header,dtype))
a78e58de5a7e diet-djbdns-dnscache-cname-handling.patch: patching djbdns
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   175
+           flagout = 1;
a78e58de5a7e diet-djbdns-dnscache-cname-handling.patch: patching djbdns
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   176
+         else if (typematch(header,DNS_T_CNAME)) {
a78e58de5a7e diet-djbdns-dnscache-cname-handling.patch: patching djbdns
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   177
+-          if (!dns_packet_getname(buf,len,pos,&cname)) goto DIE;
a78e58de5a7e diet-djbdns-dnscache-cname-handling.patch: patching djbdns
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   178
+-          flagcname = 1;
a78e58de5a7e diet-djbdns-dnscache-cname-handling.patch: patching djbdns
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   179
+-	  cnamettl = ttlget(header + 4);
a78e58de5a7e diet-djbdns-dnscache-cname-handling.patch: patching djbdns
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   180
++          if (!dns_packet_getname(buf,len,pos,&owner_name)) goto DIE;
a78e58de5a7e diet-djbdns-dnscache-cname-handling.patch: patching djbdns
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   181
+         }
a78e58de5a7e diet-djbdns-dnscache-cname-handling.patch: patching djbdns
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   182
+       }
a78e58de5a7e diet-djbdns-dnscache-cname-handling.patch: patching djbdns
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   183
+   
a78e58de5a7e diet-djbdns-dnscache-cname-handling.patch: patching djbdns
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   184
+     uint16_unpack_big(header + 8,&datalen);
a78e58de5a7e diet-djbdns-dnscache-cname-handling.patch: patching djbdns
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   185
+     pos += datalen;
a78e58de5a7e diet-djbdns-dnscache-cname-handling.patch: patching djbdns
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   186
+   }
a78e58de5a7e diet-djbdns-dnscache-cname-handling.patch: patching djbdns
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   187
++  dns_domain_free(&owner_name) ;
a78e58de5a7e diet-djbdns-dnscache-cname-handling.patch: patching djbdns
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   188
+   posauthority = pos;
a78e58de5a7e diet-djbdns-dnscache-cname-handling.patch: patching djbdns
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   189
+ 
a78e58de5a7e diet-djbdns-dnscache-cname-handling.patch: patching djbdns
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   190
+   for (j = 0;j < numauthority;++j) {
a78e58de5a7e diet-djbdns-dnscache-cname-handling.patch: patching djbdns
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   191
+@@ -515,15 +536,6 @@
a78e58de5a7e diet-djbdns-dnscache-cname-handling.patch: patching djbdns
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   192
+   }
a78e58de5a7e diet-djbdns-dnscache-cname-handling.patch: patching djbdns
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   193
+   posglue = pos;
a78e58de5a7e diet-djbdns-dnscache-cname-handling.patch: patching djbdns
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   194
+ 
a78e58de5a7e diet-djbdns-dnscache-cname-handling.patch: patching djbdns
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   195
+-
a78e58de5a7e diet-djbdns-dnscache-cname-handling.patch: patching djbdns
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   196
+-  if (!flagcname && !rcode && !flagout && flagreferral && !flagsoa)
a78e58de5a7e diet-djbdns-dnscache-cname-handling.patch: patching djbdns
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   197
+-    if (dns_domain_equal(referral,control) || !dns_domain_suffix(referral,control)) {
a78e58de5a7e diet-djbdns-dnscache-cname-handling.patch: patching djbdns
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   198
+-      log_lame(whichserver,control,referral);
a78e58de5a7e diet-djbdns-dnscache-cname-handling.patch: patching djbdns
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   199
+-      byte_zero(whichserver,4);
a78e58de5a7e diet-djbdns-dnscache-cname-handling.patch: patching djbdns
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   200
+-      goto HAVENS;
a78e58de5a7e diet-djbdns-dnscache-cname-handling.patch: patching djbdns
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   201
+-    }
a78e58de5a7e diet-djbdns-dnscache-cname-handling.patch: patching djbdns
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   202
+-
a78e58de5a7e diet-djbdns-dnscache-cname-handling.patch: patching djbdns
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   203
+-
a78e58de5a7e diet-djbdns-dnscache-cname-handling.patch: patching djbdns
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   204
+   if (records) { alloc_free(records); records = 0; }
a78e58de5a7e diet-djbdns-dnscache-cname-handling.patch: patching djbdns
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   205
+ 
a78e58de5a7e diet-djbdns-dnscache-cname-handling.patch: patching djbdns
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   206
+   k = numanswers + numauthority + numglue;
a78e58de5a7e diet-djbdns-dnscache-cname-handling.patch: patching djbdns
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   207
+@@ -670,24 +682,36 @@
a78e58de5a7e diet-djbdns-dnscache-cname-handling.patch: patching djbdns
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   208
+ 
a78e58de5a7e diet-djbdns-dnscache-cname-handling.patch: patching djbdns
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   209
+   alloc_free(records); records = 0;
a78e58de5a7e diet-djbdns-dnscache-cname-handling.patch: patching djbdns
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   210
+ 
a78e58de5a7e diet-djbdns-dnscache-cname-handling.patch: patching djbdns
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   211
++  if (byte_diff(DNS_T_CNAME,2,dtype)) {
a78e58de5a7e diet-djbdns-dnscache-cname-handling.patch: patching djbdns
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   212
++    /* This code assumes that the CNAME chain is presented in the correct 
a78e58de5a7e diet-djbdns-dnscache-cname-handling.patch: patching djbdns
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   213
++    ** order.  The example algorithm in RFC 1034 will actually result in this
a78e58de5a7e diet-djbdns-dnscache-cname-handling.patch: patching djbdns
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   214
++    ** being the case, but the words do not require it to be so.
a78e58de5a7e diet-djbdns-dnscache-cname-handling.patch: patching djbdns
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   215
++    */
a78e58de5a7e diet-djbdns-dnscache-cname-handling.patch: patching djbdns
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   216
++    pos = posanswers;
a78e58de5a7e diet-djbdns-dnscache-cname-handling.patch: patching djbdns
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   217
++    for (j = 0;j < numanswers;++j) {
a78e58de5a7e diet-djbdns-dnscache-cname-handling.patch: patching djbdns
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   218
++      pos = dns_packet_getname(buf,len,pos,&t1); if (!pos) goto DIE;
a78e58de5a7e diet-djbdns-dnscache-cname-handling.patch: patching djbdns
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   219
++      pos = dns_packet_copy(buf,len,pos,header,10); if (!pos) goto DIE;
a78e58de5a7e diet-djbdns-dnscache-cname-handling.patch: patching djbdns
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   220
++
a78e58de5a7e diet-djbdns-dnscache-cname-handling.patch: patching djbdns
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   221
++      if (dns_domain_equal(t1,d))
a78e58de5a7e diet-djbdns-dnscache-cname-handling.patch: patching djbdns
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   222
++	if (byte_equal(header + 2,2,DNS_C_IN)) { /* should always be true */
a78e58de5a7e diet-djbdns-dnscache-cname-handling.patch: patching djbdns
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   223
++	  if (typematch(header,DNS_T_CNAME)) {
a78e58de5a7e diet-djbdns-dnscache-cname-handling.patch: patching djbdns
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   224
++	    ttl = ttlget(header + 4);
a78e58de5a7e diet-djbdns-dnscache-cname-handling.patch: patching djbdns
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   225
++	    if (z->level == 0) {
a78e58de5a7e diet-djbdns-dnscache-cname-handling.patch: patching djbdns
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   226
++	      if (!move_name_to_alias(z,ttl)) goto DIE ;
a78e58de5a7e diet-djbdns-dnscache-cname-handling.patch: patching djbdns
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   227
++	    }
a78e58de5a7e diet-djbdns-dnscache-cname-handling.patch: patching djbdns
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   228
++	    if (!dns_packet_getname(buf,len,pos,&z->name[z->level])) goto DIE;
a78e58de5a7e diet-djbdns-dnscache-cname-handling.patch: patching djbdns
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   229
++	    d = z->name[z->level];
a78e58de5a7e diet-djbdns-dnscache-cname-handling.patch: patching djbdns
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   230
++	    if (!dns_domain_suffix(d,control) || !roots_same(d,control))
a78e58de5a7e diet-djbdns-dnscache-cname-handling.patch: patching djbdns
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   231
++	      goto NEWNAME ;  /* Cannot trust the chain further - restart using current name */
a78e58de5a7e diet-djbdns-dnscache-cname-handling.patch: patching djbdns
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   232
++	  }
a78e58de5a7e diet-djbdns-dnscache-cname-handling.patch: patching djbdns
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   233
++	}
a78e58de5a7e diet-djbdns-dnscache-cname-handling.patch: patching djbdns
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   234
+ 
a78e58de5a7e diet-djbdns-dnscache-cname-handling.patch: patching djbdns
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   235
+-  if (flagcname) {
a78e58de5a7e diet-djbdns-dnscache-cname-handling.patch: patching djbdns
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   236
+-    ttl = cnamettl;
a78e58de5a7e diet-djbdns-dnscache-cname-handling.patch: patching djbdns
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   237
+-    CNAME:
a78e58de5a7e diet-djbdns-dnscache-cname-handling.patch: patching djbdns
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   238
+-    if (!z->level) {
a78e58de5a7e diet-djbdns-dnscache-cname-handling.patch: patching djbdns
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   239
+-      if (z->alias[QUERY_MAXALIAS - 1]) goto DIE;
a78e58de5a7e diet-djbdns-dnscache-cname-handling.patch: patching djbdns
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   240
+-      for (j = QUERY_MAXALIAS - 1;j > 0;--j)
a78e58de5a7e diet-djbdns-dnscache-cname-handling.patch: patching djbdns
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   241
+-        z->alias[j] = z->alias[j - 1];
a78e58de5a7e diet-djbdns-dnscache-cname-handling.patch: patching djbdns
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   242
+-      for (j = QUERY_MAXALIAS - 1;j > 0;--j)
a78e58de5a7e diet-djbdns-dnscache-cname-handling.patch: patching djbdns
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   243
+-        z->aliasttl[j] = z->aliasttl[j - 1];
a78e58de5a7e diet-djbdns-dnscache-cname-handling.patch: patching djbdns
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   244
+-      z->alias[0] = z->name[0];
a78e58de5a7e diet-djbdns-dnscache-cname-handling.patch: patching djbdns
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   245
+-      z->aliasttl[0] = ttl;
a78e58de5a7e diet-djbdns-dnscache-cname-handling.patch: patching djbdns
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   246
+-      z->name[0] = 0;
a78e58de5a7e diet-djbdns-dnscache-cname-handling.patch: patching djbdns
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   247
++      uint16_unpack_big(header + 8,&datalen);
a78e58de5a7e diet-djbdns-dnscache-cname-handling.patch: patching djbdns
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   248
++      pos += datalen;
a78e58de5a7e diet-djbdns-dnscache-cname-handling.patch: patching djbdns
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   249
+     }
a78e58de5a7e diet-djbdns-dnscache-cname-handling.patch: patching djbdns
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   250
+-    if (!dns_domain_copy(&z->name[z->level],cname)) goto DIE;
a78e58de5a7e diet-djbdns-dnscache-cname-handling.patch: patching djbdns
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   251
+-    goto NEWNAME;
a78e58de5a7e diet-djbdns-dnscache-cname-handling.patch: patching djbdns
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   252
+   }
a78e58de5a7e diet-djbdns-dnscache-cname-handling.patch: patching djbdns
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   253
+ 
a78e58de5a7e diet-djbdns-dnscache-cname-handling.patch: patching djbdns
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   254
++  /* A "no such name" error applies to the end of any CNAME chain, not to the start. */
a78e58de5a7e diet-djbdns-dnscache-cname-handling.patch: patching djbdns
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   255
+   if (rcode == 3) {
a78e58de5a7e diet-djbdns-dnscache-cname-handling.patch: patching djbdns
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   256
+     log_nxdomain(whichserver,d,soattl);
a78e58de5a7e diet-djbdns-dnscache-cname-handling.patch: patching djbdns
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   257
+     cachegeneric(DNS_T_ANY,d,"",0,soattl);
a78e58de5a7e diet-djbdns-dnscache-cname-handling.patch: patching djbdns
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   258
+@@ -700,10 +724,26 @@
a78e58de5a7e diet-djbdns-dnscache-cname-handling.patch: patching djbdns
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   259
+     return 1;
a78e58de5a7e diet-djbdns-dnscache-cname-handling.patch: patching djbdns
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   260
+   }
a78e58de5a7e diet-djbdns-dnscache-cname-handling.patch: patching djbdns
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   261
+ 
a78e58de5a7e diet-djbdns-dnscache-cname-handling.patch: patching djbdns
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   262
++  /* We check for a lame server _after_ we have cached any records that it
a78e58de5a7e diet-djbdns-dnscache-cname-handling.patch: patching djbdns
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   263
++  ** might have returned to us.  This copes better with the incorrect
a78e58de5a7e diet-djbdns-dnscache-cname-handling.patch: patching djbdns
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   264
++  ** behaviour of one content DNS server software that doesn't return
a78e58de5a7e diet-djbdns-dnscache-cname-handling.patch: patching djbdns
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   265
++  ** complete CNAME chains but instead returns only the first link in a
a78e58de5a7e diet-djbdns-dnscache-cname-handling.patch: patching djbdns
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   266
++  ** chain followed by a lame delegation to the same server.
a78e58de5a7e diet-djbdns-dnscache-cname-handling.patch: patching djbdns
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   267
++  ** Also: We check for a lame server _after_ following the CNAME chain.  The
a78e58de5a7e diet-djbdns-dnscache-cname-handling.patch: patching djbdns
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   268
++  ** delegation in a referral answer applies to the _end_ of the chain, not
a78e58de5a7e diet-djbdns-dnscache-cname-handling.patch: patching djbdns
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   269
++  ** to the beginning.
a78e58de5a7e diet-djbdns-dnscache-cname-handling.patch: patching djbdns
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   270
++  */
a78e58de5a7e diet-djbdns-dnscache-cname-handling.patch: patching djbdns
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   271
++  if (!rcode && !flagout && flagreferral && !flagsoa)
a78e58de5a7e diet-djbdns-dnscache-cname-handling.patch: patching djbdns
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   272
++    if (dns_domain_equal(referral,control) || !dns_domain_suffix(referral,control)) {
a78e58de5a7e diet-djbdns-dnscache-cname-handling.patch: patching djbdns
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   273
++      log_lame(whichserver,control,referral);
a78e58de5a7e diet-djbdns-dnscache-cname-handling.patch: patching djbdns
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   274
++      byte_zero(whichserver,4);
a78e58de5a7e diet-djbdns-dnscache-cname-handling.patch: patching djbdns
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   275
++      goto HAVENS;
a78e58de5a7e diet-djbdns-dnscache-cname-handling.patch: patching djbdns
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   276
++    }
a78e58de5a7e diet-djbdns-dnscache-cname-handling.patch: patching djbdns
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   277
++
a78e58de5a7e diet-djbdns-dnscache-cname-handling.patch: patching djbdns
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   278
+   if (!flagout && flagsoa)
a78e58de5a7e diet-djbdns-dnscache-cname-handling.patch: patching djbdns
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   279
++    /* Don't save empty RRSets for those types that we use as special markers. */
a78e58de5a7e diet-djbdns-dnscache-cname-handling.patch: patching djbdns
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   280
+     if (byte_diff(DNS_T_ANY,2,dtype))
a78e58de5a7e diet-djbdns-dnscache-cname-handling.patch: patching djbdns
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   281
+-      if (byte_diff(DNS_T_AXFR,2,dtype))
a78e58de5a7e diet-djbdns-dnscache-cname-handling.patch: patching djbdns
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   282
+-        if (byte_diff(DNS_T_CNAME,2,dtype)) {
a78e58de5a7e diet-djbdns-dnscache-cname-handling.patch: patching djbdns
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   283
++      if (byte_diff(DNS_T_AXFR,2,dtype)) {
a78e58de5a7e diet-djbdns-dnscache-cname-handling.patch: patching djbdns
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   284
+           save_start();
a78e58de5a7e diet-djbdns-dnscache-cname-handling.patch: patching djbdns
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   285
+           save_finish(dtype,d,soattl);
a78e58de5a7e diet-djbdns-dnscache-cname-handling.patch: patching djbdns
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   286
+ 	  log_nodata(whichserver,d,dtype,soattl);
a78e58de5a7e diet-djbdns-dnscache-cname-handling.patch: patching djbdns
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   287
+@@ -815,6 +855,7 @@
a78e58de5a7e diet-djbdns-dnscache-cname-handling.patch: patching djbdns
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   288
+   DIE:
a78e58de5a7e diet-djbdns-dnscache-cname-handling.patch: patching djbdns
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   289
+   cleanup(z);
a78e58de5a7e diet-djbdns-dnscache-cname-handling.patch: patching djbdns
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   290
+   if (records) { alloc_free(records); records = 0; }
a78e58de5a7e diet-djbdns-dnscache-cname-handling.patch: patching djbdns
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   291
++  dns_domain_free(&owner_name) ;
a78e58de5a7e diet-djbdns-dnscache-cname-handling.patch: patching djbdns
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   292
+   return -1;
a78e58de5a7e diet-djbdns-dnscache-cname-handling.patch: patching djbdns
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   293
+ }
a78e58de5a7e diet-djbdns-dnscache-cname-handling.patch: patching djbdns
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   294
+