djbdns/080-dnscache-cache-negatives.patch

42 lines
1.0 KiB
Diff

--- 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;