summaryrefslogtreecommitdiffstats
path: root/net/djbdns/patches/080-dnscache-cache-negatives.patch
blob: 793ac8718b3fb633fabff91147fe62ab590b240d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
--- a/query.c
+++ b/query.c
@@ -193,6 +193,7 @@ static int doit(struct query *z,int stat
   int k;
   int p;
   int q;
+  uint32 cachettl;
 
   errno = error_io;
   if (state == 1) goto HAVEPACKET;
@@ -470,6 +471,7 @@ static int doit(struct query *z,int stat
   rcode = header[3] & 15;
   if (rcode && (rcode != 3)) goto DIE; /* impossible; see irrelevant() */
 
+  cachettl = 0;
   flagout = 0;
   flagcname = 0;
   flagreferral = 0;
@@ -512,6 +514,11 @@ static int doit(struct query *z,int stat
 
     uint16_unpack_big(header + 8,&datalen);
     pos += datalen;
+
+    if (flagsoa && (pos <= len)) {
+      cachettl = ttlget(buf + pos - 4);
+      if (soattl < cachettl) cachettl = soattl;
+    }
   }
   posglue = pos;
 
@@ -689,8 +696,8 @@ static int doit(struct query *z,int stat
   }
 
   if (rcode == 3) {
-    log_nxdomain(whichserver,d,soattl);
-    cachegeneric(DNS_T_ANY,d,"",0,soattl);
+    log_nxdomain(whichserver,d,cachettl);
+    cachegeneric(DNS_T_ANY,d,"",0,cachettl);
 
     NXDOMAIN:
     if (z->level) goto LOWERLEVEL;