summaryrefslogtreecommitdiffstats
path: root/contrib/bind/named
diff options
context:
space:
mode:
Diffstat (limited to 'contrib/bind/named')
-rw-r--r--contrib/bind/named/Version.c5
-rw-r--r--contrib/bind/named/db_defs.h10
-rw-r--r--contrib/bind/named/db_func.h3
-rw-r--r--contrib/bind/named/db_load.c11
-rw-r--r--contrib/bind/named/db_secure.c4
-rw-r--r--contrib/bind/named/db_update.c6
-rw-r--r--contrib/bind/named/named-xfer.c347
-rw-r--r--contrib/bind/named/ns_forw.c9
-rw-r--r--contrib/bind/named/ns_glob.h3
-rw-r--r--contrib/bind/named/ns_init.c28
-rw-r--r--contrib/bind/named/ns_main.c17
-rw-r--r--contrib/bind/named/ns_ncache.c2
-rw-r--r--contrib/bind/named/ns_req.c8
-rw-r--r--contrib/bind/named/ns_resp.c256
-rw-r--r--contrib/bind/named/ns_validate.c2
15 files changed, 496 insertions, 215 deletions
diff --git a/contrib/bind/named/Version.c b/contrib/bind/named/Version.c
index 60a7ba8..e89670b 100644
--- a/contrib/bind/named/Version.c
+++ b/contrib/bind/named/Version.c
@@ -1,14 +1,15 @@
/*
* @(#)Version.c 4.9 (Berkeley) 7/21/90
- * $Id: Version.c,v 8.1 1994/12/15 06:24:14 vixie Exp $
+ * $Id: Version.c,v 8.2 1997/06/01 20:34:34 vixie Exp $
*/
#ifndef lint
char sccsid[] = "@(#)named %VERSION% %WHEN% %WHOANDWHERE%";
-char rcsid[] = "$Id: Version.c,v 8.1 1994/12/15 06:24:14 vixie Exp $";
+char rcsid[] = "$Id: Version.c,v 8.2 1997/06/01 20:34:34 vixie Exp $";
#endif /* not lint */
char Version[] = "named %VERSION% %WHEN%\n\t%WHOANDWHERE%";
+char ShortVersion[] = "%VERSION%";
#ifdef COMMENT
diff --git a/contrib/bind/named/db_defs.h b/contrib/bind/named/db_defs.h
index 7882393..83fc2da 100644
--- a/contrib/bind/named/db_defs.h
+++ b/contrib/bind/named/db_defs.h
@@ -1,6 +1,6 @@
/*
* from db.h 4.16 (Berkeley) 6/1/90
- * $Id: db_defs.h,v 8.5 1996/08/27 08:33:23 vixie Exp $
+ * $Id: db_defs.h,v 8.6 1997/06/01 20:34:34 vixie Exp $
*/
/*
@@ -76,6 +76,9 @@
*/
struct databuf {
struct databuf *d_next; /* linked list */
+#ifdef STATS
+ struct nameser *d_ns; /* NS from whence this came */
+#endif
u_int32_t d_ttl; /* time to live */
/* if d_zone == DB_Z_CACHE, then
* d_ttl is actually the time when
@@ -91,13 +94,10 @@ struct databuf {
int16_t d_class; /* class number */
int16_t d_type; /* type number */
int16_t d_size; /* size of data area */
+ u_int32_t d_rcnt;
#ifdef NCACHE
unsigned d_rcode :4; /* rcode added for negative caching */
#endif
- unsigned d_rcnt :12;
-#ifdef STATS
- struct nameser *d_ns; /* NS from whence this came */
-#endif
u_int16_t d_nstime; /* NS response time, milliseconds */
u_char d_data[sizeof(char*)]; /* malloc'd (padded) */
};
diff --git a/contrib/bind/named/db_func.h b/contrib/bind/named/db_func.h
index 5d3929d..87e4faf 100644
--- a/contrib/bind/named/db_func.h
+++ b/contrib/bind/named/db_func.h
@@ -1,6 +1,6 @@
/* db_proc.h - prototypes for functions in db_*.c
*
- * $Id: db_func.h,v 8.12 1996/09/22 00:13:10 vixie Exp $
+ * $Id: db_func.h,v 8.13 1997/06/01 20:34:34 vixie Exp $
*/
/* ++from db_update.c++ */
@@ -11,6 +11,7 @@ extern int db_update __P((char name[],
struct hashbuf *htp)),
db_cmp __P((struct databuf *,struct databuf *)),
findMyZone __P((struct namebuf *np, int class));
+extern void fixttl __P((struct databuf *dp));
/* --from db_update.c-- */
/* ++from db_reload.c++ */
diff --git a/contrib/bind/named/db_load.c b/contrib/bind/named/db_load.c
index 6b0a11a..6251f42 100644
--- a/contrib/bind/named/db_load.c
+++ b/contrib/bind/named/db_load.c
@@ -1,6 +1,6 @@
#if !defined(lint) && !defined(SABER)
static char sccsid[] = "@(#)db_load.c 4.38 (Berkeley) 3/2/91";
-static char rcsid[] = "$Id: db_load.c,v 8.31 1996/12/18 04:09:48 vixie Exp $";
+static char rcsid[] = "$Id: db_load.c,v 8.32 1997/06/01 20:34:34 vixie Exp $";
#endif /* not lint */
/*
@@ -323,6 +323,13 @@ db_load(filename, in_origin, zp, def_domain)
n = n * 10 + (*cp++ - '0');
}
while (isdigit(*cp));
+ if (*cp != '\0') {
+ errs++;
+ syslog(LOG_INFO,
+ "%s: Line %d: bad TTL: %s.\n",
+ filename, lineno, buf);
+ break;
+ }
if (zp->z_type == Z_CACHE) {
/* this allows the cache entry to age */
/* while sitting on disk (powered off) */
@@ -1988,7 +1995,7 @@ get_netlist(fp, netlistp, allow, print_tag)
char *print_tag;
{
struct netinfo *ntp, **end;
- char buf[BUFSIZ], *maskp;
+ char buf[MAXDNAME], *maskp;
struct in_addr ina;
for (end = netlistp; *end; end = &(**end).next)
diff --git a/contrib/bind/named/db_secure.c b/contrib/bind/named/db_secure.c
index 0ec8353..db57708 100644
--- a/contrib/bind/named/db_secure.c
+++ b/contrib/bind/named/db_secure.c
@@ -1,5 +1,5 @@
#ifndef LINT
-static char rcsid[] = "$Id: db_secure.c,v 8.6 1996/05/17 09:10:46 vixie Exp $";
+static char rcsid[] = "$Id: db_secure.c,v 8.7 1997/06/01 20:34:34 vixie Exp $";
#endif
/* this file was contributed by Gregory Neil Shapiro of WPI in August 1993 */
@@ -29,7 +29,7 @@ build_secure_netlist(zp)
struct zoneinfo *zp;
{
struct netinfo *ntp = NULL, **netlistp, **end;
- char buf[BUFSIZ];
+ char buf[MAXDNAME];
struct hashbuf *htp;
struct namebuf *snp;
struct databuf *dp;
diff --git a/contrib/bind/named/db_update.c b/contrib/bind/named/db_update.c
index bacc7f7..b74ac5a 100644
--- a/contrib/bind/named/db_update.c
+++ b/contrib/bind/named/db_update.c
@@ -1,6 +1,6 @@
#if !defined(lint) && !defined(SABER)
static char sccsid[] = "@(#)db_update.c 4.28 (Berkeley) 3/21/91";
-static char rcsid[] = "$Id: db_update.c,v 8.18 1996/10/08 04:51:03 vixie Exp $";
+static char rcsid[] = "$Id: db_update.c,v 8.19 1997/06/01 20:34:34 vixie Exp $";
#endif /* not lint */
/*
@@ -71,8 +71,6 @@ static char rcsid[] = "$Id: db_update.c,v 8.18 1996/10/08 04:51:03 vixie Exp $";
#include "named.h"
-static void fixttl __P((struct databuf *));
-
/* int
* isRefByNS(name, htp)
* recurse through all of `htp' looking for NS RR's that refer to `name'.
@@ -637,7 +635,7 @@ db_update(name, odp, newdp, flags, htp)
return (OK);
}
-static void
+void
fixttl(dp)
register struct databuf *dp;
{
diff --git a/contrib/bind/named/named-xfer.c b/contrib/bind/named/named-xfer.c
index 1772b84..3b578e2 100644
--- a/contrib/bind/named/named-xfer.c
+++ b/contrib/bind/named/named-xfer.c
@@ -92,7 +92,7 @@ char copyright[] =
#if !defined(lint) && !defined(SABER)
static char sccsid[] = "@(#)named-xfer.c 4.18 (Berkeley) 3/7/91";
-static char rcsid[] = "$Id: named-xfer.c,v 8.22 1996/12/02 09:17:21 vixie Exp $";
+static char rcsid[] = "$Id: named-xfer.c,v 8.23 1997/06/01 20:34:34 vixie Exp $";
#endif /* not lint */
#include <sys/types.h>
@@ -152,14 +152,27 @@ static char *ProgName;
static void usage __P((const char *));
static int getzone __P((struct zoneinfo *, u_int32_t, int)),
- print_output __P((u_char *, int, u_char *)),
+ print_output __P((struct zoneinfo *, u_int32_t,
+ u_char *, int, u_char *)),
netread __P((int, char *, int, int));
static SIG_FN read_alarm __P(());
+static SIG_FN term_handler __P(());
static const char *soa_zinfo __P((struct zoneinfo *, u_char *, u_char*));
+struct zoneinfo zp_start, zp_finish;
+
extern char *optarg;
extern int optind, getopt();
+
+void
+cleanup_for_exit() {
+#ifdef DEBUG
+ if (!debug)
+#endif
+ (void) unlink(tmpname);
+}
+
void
main(argc, argv)
int argc;
@@ -451,11 +464,8 @@ main(argc, argv)
/* fall through */
case XFER_TIMEOUT:
case XFER_FAIL:
-#ifdef DEBUG
- if (!debug)
-#endif
- (void) unlink(tmpname);
- exit(result); /* error or timeout */
+ cleanup_for_exit();
+ exit(result);
}
/*NOTREACHED*/
}
@@ -493,7 +503,12 @@ usage(msg)
#define DEF_DNAME '\001' /* '\0' means the root domain */
/* XXX: The following variables should probably all be "static" */
-int minimum_ttl = 0, got_soa = 0;
+u_int32_t minimum_ttl = 0;
+int soa_cnt = 0;
+#ifdef STUBS
+int ns_cnt = 0;
+#endif
+int query_type = 0;
int prev_comment = 0; /* was previous record a comment? */
char zone_top[MAXDNAME]; /* the top of the zone */
char prev_origin[MAXDNAME]; /* from most recent $ORIGIN line */
@@ -509,14 +524,13 @@ getzone(zp, serial_no, port)
HEADER *hp;
u_int16_t len;
u_int32_t serial;
- int s, n, l, nscnt, soacnt, error = 0;
+ int s, n, l, error = 0;
u_int cnt;
u_char *cp, *nmp, *eom, *tmp ;
u_char *buf = NULL;
u_int bufsize;
char name[MAXDNAME], name2[MAXDNAME];
struct sockaddr_in sin;
- struct zoneinfo zp_start, zp_finish;
#ifdef POSIX_SIGNALS
struct sigaction sv, osv;
#else
@@ -548,11 +562,19 @@ getzone(zp, serial_no, port)
/* sv.sa_flags = SA_ONSTACK; */
sigfillset(&sv.sa_mask);
(void) sigaction(SIGALRM, &sv, &osv);
+ bzero((char *)&sv, sizeof sv);
+ sv.sa_handler = (SIG_FN (*)()) term_handler;
+ sigfillset(&sv.sa_mask);
+ (void) sigaction(SIGTERM, &sv, &osv);
#else
bzero((char *)&sv, sizeof sv);
sv.sv_handler = read_alarm;
sv.sv_mask = ~0;
(void) sigvec(SIGALRM, &sv, &osv);
+ bzero((char *)&sv, sizeof sv);
+ sv.sv_handler = term_handler;
+ sv.sv_mask = ~0;
+ (void) sigvec(SIGTERM, &sv, &osv);
#endif
strcpy(zone_top, zp->z_origin);
@@ -781,8 +803,10 @@ getzone(zp, serial_no, port)
dprintf(1, (ddt, "need update, serial %lu\n",
(u_long)zp_start.z_serial));
hp = (HEADER *) buf;
- soacnt = 0;
- nscnt = 0;
+ soa_cnt = 0;
+#ifdef STUBS
+ ns_cnt = 0;
+#endif
gettime(&tt);
for (l = Version; l; l = nl) {
size_t len;
@@ -805,21 +829,19 @@ getzone(zp, serial_no, port)
inet_ntoa(sin.sin_addr),
ctimel(tt.tv_sec));
for (;;) {
- if ((soacnt == 0) || (zp->z_type == Z_STUB)) {
- int type;
+ if ((soa_cnt == 0) || (zp->z_type == Z_STUB)) {
#ifdef STUBS
if (zp->z_type == Z_STUB) {
- if (!soacnt)
- type = T_SOA;
- else if (!nscnt)
- type = T_NS;
- else
- type = T_SOA;
+ if (soa_cnt == 1 &&
+ ns_cnt == 0)
+ query_type = T_NS;
+ else
+ query_type = T_SOA;
} else
#endif
- type = T_AXFR;
+ query_type = T_AXFR;
n = res_mkquery(QUERY, zp->z_origin,
- curclass, type,
+ curclass, query_type,
NULL, 0,
NULL, buf, bufsize);
if (n < 0) {
@@ -827,7 +849,7 @@ getzone(zp, serial_no, port)
#ifdef STUBS
if (zp->z_type == Z_STUB)
syslog(LOG_INFO,
- (type == T_SOA)
+ (query_type == T_SOA)
? "zone %s: res_mkquery T_SOA failed"
: "zone %s: res_mkquery T_NS failed",
zp->z_origin);
@@ -862,13 +884,27 @@ getzone(zp, serial_no, port)
* Receive length & response
*/
if (netread(s, (char *)buf, INT16SZ,
- (soacnt == 0) ?300 :XFER_TIMER)
+ (soa_cnt == 0) ?300 :XFER_TIMER)
< 0) {
error++;
break;
}
if ((len = _getshort(buf)) == 0)
break;
+ if (len > bufsize) {
+ buf = (u_char *)realloc(buf, len);
+ if (buf == NULL) {
+ syslog(LOG_INFO,
+ "malloc(%u) failed for packet from server [%s], zone %s\n",
+ len,
+ inet_ntoa(sin.sin_addr),
+ zp->z_origin);
+ error++;
+ break;
+ }
+ bufsize = len;
+ }
+ hp = (HEADER *)buf;
eom = buf + len;
if (netread(s, (char *)buf, len, XFER_TIMER)
< 0) {
@@ -907,30 +943,49 @@ getzone(zp, serial_no, port)
if (zp->z_type == Z_STUB) {
ancount = ntohs(hp->ancount);
for (n = cnt = 0 ; cnt < ancount ; cnt++) {
- n = print_output(buf, bufsize, cp);
+ n = print_output(zp, serial_no, buf,
+ len, cp);
if (n < 0)
break;
cp += n;
}
+ /*
+ * If we've processed the answer section and
+ * didn't get any useful answers, bail out.
+ */
+ if (query_type == T_SOA && soa_cnt == 0) {
+ syslog(LOG_ERR,
+ "stubs: no SOA in answer");
+ error++;
+ break;
+ }
+ if (query_type == T_NS && ns_cnt == 0) {
+ syslog(LOG_ERR,
+ "stubs: no NS in answer");
+ error++;
+ break;
+ }
if (n >= 0 && hp->nscount) {
- /* we should not get here */
ancount = ntohs(hp->nscount);
- for (cnt = 0 ; cnt < ancount ; cnt++) {
- n = print_output(buf, bufsize, cp);
- if (n < 0)
- break;
- cp += n;
+ for (cnt = 0; cnt < ancount; cnt++) {
+ n = print_output(zp,
+ serial_no,
+ buf, len, cp);
+ if (n < 0)
+ break;
+ cp += n;
}
}
ancount = ntohs(hp->arcount);
- for (cnt = 0 ; n >= 0 && cnt < ancount ; cnt++) {
- n = print_output(buf, bufsize, cp);
+ for (cnt = 0; n >= 0 && cnt < ancount; cnt++) {
+ n = print_output(zp, serial_no, buf,
+ len, cp);
cp += n;
}
if (n < 0) {
syslog(LOG_INFO,
- "print_output: unparseable answer (%d), zone %s",
- hp->rcode, zp->z_origin);
+ "print_output: unparseable answer (%d), zone %s",
+ hp->rcode, zp->z_origin);
error++;
break;
}
@@ -941,12 +996,12 @@ getzone(zp, serial_no, port)
error++;
break;
}
-
} else {
#endif /*STUBS*/
ancount = ntohs(hp->ancount);
for (n = cnt = 0; cnt < ancount; cnt++) {
- n = print_output(buf, bufsize, cp);
+ n = print_output(zp, serial_no, buf,
+ len, cp);
if (n < 0)
break;
cp += n;
@@ -969,98 +1024,10 @@ getzone(zp, serial_no, port)
#ifdef STUBS
}
#endif
- GETSHORT(n, tmp);
- if (n == T_SOA) {
- if (soacnt == 0) {
- soacnt++;
- if (dn_expand(buf, buf+PACKETSZ, nmp,
- name, sizeof name) < 0) {
- badsoa_msg = "soa name error";
- goto badsoa;
- }
- if (strcasecmp(name, zp->z_origin)!=0){
- syslog(LOG_INFO,
- "wrong zone name in AXFR (wanted \"%s\", got \"%s\")",
- zp->z_origin, name);
- badsoa_msg = "wrong soa name";
- goto badsoa;
- }
- if (eom - tmp
- <= 2 * INT16SZ + INT32SZ) {
- badsoa_msg = "soa header";
- goto badsoa;
- }
- tmp += 2 * INT16SZ + INT32SZ;
- if ((n = dn_skipname(tmp, eom)) < 0) {
- badsoa_msg = "soa mname";
- goto badsoa;
- }
- tmp += n;
- if ((n = dn_skipname(tmp, eom)) < 0) {
- badsoa_msg = "soa hname";
- goto badsoa;
- }
- tmp += n;
- if (eom - tmp <= INT32SZ) {
- badsoa_msg = "soa dlen";
- goto badsoa;
- }
- GETLONG(serial, tmp);
- dprintf(3, (ddt,
- "first SOA for %s, serial %lu\n",
- name, (u_long)serial));
- continue;
- }
- if (dn_expand(buf, buf+PACKETSZ, nmp,
- name2, sizeof name2) == -1) {
- badsoa_msg = "soa name error#2";
- goto badsoa;
- }
- if (strcasecmp((char *)name,
- (char *)name2) != 0) {
- syslog(LOG_INFO,
- "got extra SOA for \"%s\" in zone \"%s\"",
- name2, name);
- continue;
- }
- tmp -= INT16SZ; /* Put TYPE back. */
- badsoa_msg = soa_zinfo(&zp_finish, tmp, eom);
- if (badsoa_msg)
- goto badsoa;
- dprintf(2, (ddt,
- "SOA, serial %lu\n",
- (u_long)zp_finish.z_serial));
- if (serial != zp_finish.z_serial) {
- soacnt = 0;
- got_soa = 0;
- minimum_ttl = 0;
- strcpy(prev_origin, zp->z_origin);
- prev_dname[0] = DEF_DNAME;
- dprintf(1, (ddt,
- "serial changed, restart\n"
- ));
- /*
- * Flush buffer, truncate file
- * and seek to beginning to restart.
- */
- fflush(dbfp);
- if (ftruncate(fileno(dbfp), 0) != 0) {
- if (!quiet)
- syslog(LOG_INFO,
- "ftruncate %s: %m\n",
- tmpname);
- return (XFER_FAIL);
- }
- fseek(dbfp, 0L, 0);
- } else
- break;
-#ifdef STUBS
- } else if (zp->z_type == Z_STUB && n == T_NS) {
- nscnt++;
- } else if (zp->z_type == Z_STUB) {
+
+ if (soa_cnt >= 2)
break;
-#endif
- }
+
}
(void) my_close(s);
if (error == 0) {
@@ -1099,6 +1066,12 @@ getzone(zp, serial_no, port)
return (XFER_FAIL);
}
+static SIG_FN
+term_handler() {
+ cleanup_for_exit();
+ _exit(XFER_FAIL); /* not safe to call exit() from a signal handler */
+}
+
/*
* Set flag saying to read was interrupted
* used for a read timer
@@ -1216,7 +1189,9 @@ soa_zinfo(zp, cp, eom)
* Does minimal error checking on the message content.
*/
static int
-print_output(msg, msglen, rrp)
+print_output(zp, serial_no, msg, msglen, rrp)
+ struct zoneinfo *zp;
+ u_int32_t serial_no;
u_char *msg;
int msglen;
u_char *rrp;
@@ -1226,11 +1201,13 @@ print_output(msg, msglen, rrp)
u_int32_t addr, ttl;
int i, j, tab, result, class, type, dlen, n1, n;
char data[BUFSIZ];
- u_char *cp1, *cp2, *temp_ptr;
+ u_char *cp1, *cp2, *temp_ptr, *eom, *rr_type_ptr;
u_char *cdata;
char *origin, *proto, dname[MAXDNAME];
char *ignore = "";
+ const char *badsoa_msg;
+ eom = msg + msglen;
cp = rrp;
n = dn_expand(msg, msg + msglen, cp, dname, sizeof dname);
if (n < 0) {
@@ -1238,6 +1215,7 @@ print_output(msg, msglen, rrp)
return (-1);
}
cp += n;
+ rr_type_ptr = cp;
GETSHORT(type, cp);
GETSHORT(class, cp);
GETLONG(ttl, cp);
@@ -1249,8 +1227,8 @@ print_output(msg, msglen, rrp)
else
origin++; /* move past the '.' */
dprintf(3, (ddt,
- "print_output: dname %s type %d class %d ttl %d\n",
- dname, type, class, ttl));
+ "print_output: dname %s type %d class %d ttl %lu\n",
+ dname, type, class, (u_long)ttl));
/*
* Convert the resource record data into the internal database format.
* CP points to the raw resource record.
@@ -1316,6 +1294,10 @@ print_output(msg, msglen, rrp)
cp += n;
cp1 += strlen((char *) cp1) + 1;
if (type == T_SOA) {
+ if ((eom - cp) < (5 * INT32SZ)) {
+ hp->rcode = FORMERR;
+ return (-1);
+ }
temp_ptr = cp + 4 * INT32SZ;
GETLONG(minimum_ttl, temp_ptr);
n = 5 * INT32SZ;
@@ -1375,14 +1357,14 @@ print_output(msg, msglen, rrp)
cp += INT16SZ;
if (type == T_SRV) {
- bcopy((char *)cp, data, INT16SZ*2);
+ bcopy((char *)cp, cp1, INT16SZ*2);
cp1 += INT16SZ*2;
cp += INT16SZ*2;
}
/* get name */
n = dn_expand(msg, msg + msglen, cp,
- (char *)cp1, sizeof data - INT16SZ);
+ (char *)cp1, sizeof data - (cp1-(u_char *)data));
if (n < 0)
return (-1);
cp += n;
@@ -1470,13 +1452,99 @@ print_output(msg, msglen, rrp)
result = cp - rrp;
/*
- * Only print one SOA per db file
+ * Special handling for SOA records.
*/
+
if (type == T_SOA) {
- if (got_soa)
+ if (strcasecmp(dname, zp->z_origin) != 0) {
+ syslog(LOG_INFO,
+ "wrong zone name in AXFR (wanted \"%s\", got \"%s\")",
+ zp->z_origin, dname);
+ hp->rcode = FORMERR;
+ return (-1);
+ }
+ if (!soa_cnt) {
+ badsoa_msg = soa_zinfo(&zp_start, rr_type_ptr, eom);
+ if (badsoa_msg) {
+ syslog(LOG_INFO,
+ "malformed SOA for zone %s: %s",
+ zp->z_origin, badsoa_msg);
+ hp->rcode = FORMERR;
+ return (-1);
+ }
+ if (SEQ_GT(zp_start.z_serial, serial_no) ||
+ !serial_no)
+ soa_cnt++;
+ else {
+ syslog(LOG_INFO,
+ "serial went backwards after transfer started");
+ return (-1);
+ }
+ } else {
+ badsoa_msg = soa_zinfo(&zp_finish, rr_type_ptr, eom);
+ if (badsoa_msg) {
+ syslog(LOG_INFO,
+ "malformed SOA for zone %s: %s",
+ zp->z_origin, badsoa_msg);
+ hp->rcode = FORMERR;
+ return (-1);
+ }
+ dprintf(2, (ddt, "SOA, serial %lu\n",
+ (u_long)zp_finish.z_serial));
+ if (zp_start.z_serial != zp_finish.z_serial) {
+ dprintf(1, (ddt, "serial changed, restart\n"));
+ soa_cnt = 0;
+#ifdef STUBS
+ ns_cnt = 0;
+#endif
+ minimum_ttl = 0;
+ strcpy(prev_origin, zp->z_origin);
+ prev_dname[0] = DEF_DNAME;
+ /*
+ * Flush buffer, truncate file
+ * and seek to beginning to restart.
+ */
+ fflush(dbfp);
+ if (ftruncate(fileno(dbfp), 0) != 0) {
+ if (!quiet)
+ syslog(LOG_INFO,
+ "ftruncate %s: %m\n",
+ tmpname);
+ return (-1);
+ }
+ fseek(dbfp, 0L, 0);
+ return (result);
+ }
+ soa_cnt++;
return (result);
+ }
+ }
+
+#ifdef STUBS
+ if (zp->z_type == Z_STUB) {
+ if (query_type == T_NS && type == T_NS)
+ ns_cnt++;
+ /*
+ * If we're processing a response to an SOA query, we don't
+ * want to print anything from the response except for the SOA.
+ * We do want to check everything in the packet, which is
+ * why we do this check now instead of earlier.
+ */
+ if (query_type == T_SOA && type != T_SOA)
+ return (result);
+ }
+#endif
+
+ if (!soa_cnt || soa_cnt >= 2) {
+ char *gripe;
+
+ if (!soa_cnt)
+ gripe = "got RR before first SOA";
else
- got_soa++;
+ gripe = "got RR after second SOA";
+ syslog(LOG_INFO, "%s in zone %s", gripe, zp->z_origin);
+ hp->rcode = FORMERR;
+ return (-1);
}
#ifdef NO_GLUE
@@ -1570,7 +1638,7 @@ print_output(msg, msglen, rrp)
}
if (ttl != minimum_ttl)
- (void) fprintf(dbfp, "%d\t", (int) ttl);
+ (void) fprintf(dbfp, "%lu\t", (u_long) ttl);
else if (tab)
(void) putc('\t', dbfp);
@@ -1837,7 +1905,7 @@ print_output(msg, msglen, rrp)
cp++;
/* orig time to live (TTL)) */
- (void) fprintf(dbfp," %d", _getlong((u_char*)cp));
+ (void) fprintf(dbfp," %lu", (u_long)_getlong((u_char*)cp));
cp += INT32SZ;
/* expiration time */
@@ -1873,6 +1941,7 @@ print_output(msg, msglen, rrp)
}
if (ferror(dbfp)) {
syslog(LOG_ERR, "%s: %m", tmpname);
+ cleanup_for_exit();
exit(XFER_FAIL);
}
return (result);
diff --git a/contrib/bind/named/ns_forw.c b/contrib/bind/named/ns_forw.c
index f523855..06d428b 100644
--- a/contrib/bind/named/ns_forw.c
+++ b/contrib/bind/named/ns_forw.c
@@ -1,6 +1,6 @@
#if !defined(lint) && !defined(SABER)
static char sccsid[] = "@(#)ns_forw.c 4.32 (Berkeley) 3/3/91";
-static char rcsid[] = "$Id: ns_forw.c,v 8.19 1996/12/02 09:27:36 vixie Exp $";
+static char rcsid[] = "$Id: ns_forw.c,v 8.20 1997/06/01 20:34:34 vixie Exp $";
#endif /* not lint */
/*
@@ -559,6 +559,13 @@ nslookup(nsp, qp, syslogdname, sysloginfo)
qs->nsdata = dp;
qs->nretry = 0;
/*
+ * If this A RR has no RTT, initialize its RTT to a
+ * small random value.
+ */
+ if (dp->d_nstime == 0)
+ dp->d_nstime = 1 +
+ (int)(25.0*rand()/(RAND_MAX + 1.0));
+ /*
* if we are being asked to fwd a query whose
* nameserver list includes our own name/address(es),
* then we have detected a lame delegation and rather
diff --git a/contrib/bind/named/ns_glob.h b/contrib/bind/named/ns_glob.h
index bf31e33..efb0035 100644
--- a/contrib/bind/named/ns_glob.h
+++ b/contrib/bind/named/ns_glob.h
@@ -1,6 +1,6 @@
/*
* from ns.h 4.33 (Berkeley) 8/23/90
- * $Id: ns_glob.h,v 8.11 1996/11/11 06:36:49 vixie Exp $
+ * $Id: ns_glob.h,v 8.12 1997/06/01 20:34:34 vixie Exp $
*/
/*
@@ -248,6 +248,7 @@ DECL const char sendtoStr[] INIT("sendto");
/* defined in version.c, can't use DECL/INIT */
extern char Version[];
+extern char ShortVersion[];
/* max value of xfers_running */
DECL int max_xfers_running INIT(MAX_XFERS_RUNNING);
diff --git a/contrib/bind/named/ns_init.c b/contrib/bind/named/ns_init.c
index 8a6fd92..a94e1d4 100644
--- a/contrib/bind/named/ns_init.c
+++ b/contrib/bind/named/ns_init.c
@@ -1,6 +1,6 @@
#if !defined(lint) && !defined(SABER)
static char sccsid[] = "@(#)ns_init.c 4.38 (Berkeley) 3/21/91";
-static char rcsid[] = "$Id: ns_init.c,v 8.24 1996/12/02 09:17:21 vixie Exp $";
+static char rcsid[] = "$Id: ns_init.c,v 8.25 1997/06/01 20:34:34 vixie Exp $";
#endif /* not lint */
/*
@@ -233,7 +233,7 @@ boot_read(filename, includefile)
int includefile;
{
register struct zoneinfo *zp;
- char buf[BUFSIZ], obuf[BUFSIZ], *source;
+ char buf[MAXDNAME], obuf[MAXDNAME], *source;
FILE *fp;
int type;
int class;
@@ -576,21 +576,25 @@ boot_read(filename, includefile)
(strcmp(source, zp->z_source) ||
(stat(zp->z_source, &f_time) == -1 ||
(zp->z_ftime != f_time.st_mtime)))) {
- dprintf(1, (ddt, "backup file changed\n"));
+ dprintf(1, (ddt,
+ "backup file changed or missing\n"));
free(zp->z_source);
zp->z_source = NULL;
- zp->z_flags &= ~Z_AUTH;
zp->z_serial = 0; /* force xfer */
+ if (zp->z_flags & Z_AUTH) {
+ zp->z_flags &= ~Z_AUTH;
#ifdef CLEANCACHE
- remove_zone(hashtab, zp - zones, 1);
+ remove_zone(hashtab, zp - zones, 1);
#else
- remove_zone(hashtab, zp - zones);
+ remove_zone(hashtab, zp - zones);
#endif
- /*
- * reload parent so that NS records are
- * present during the zone transfer.
- */
- do_reload(zp->z_origin, zp->z_type, zp->z_class);
+ /*
+ * reload parent so that NS records are
+ * present during the zone transfer.
+ */
+ do_reload(zp->z_origin, zp->z_type,
+ zp->z_class);
+ }
}
if (zp->z_source)
free(source);
@@ -674,7 +678,7 @@ static void
get_forwarders(fp)
FILE *fp;
{
- char buf[BUFSIZ];
+ char buf[MAXDNAME];
register struct fwdinfo *fip = NULL, *ftp = NULL;
#ifdef SLAVE_FORWARD
diff --git a/contrib/bind/named/ns_main.c b/contrib/bind/named/ns_main.c
index 6fff4cc..7f88082 100644
--- a/contrib/bind/named/ns_main.c
+++ b/contrib/bind/named/ns_main.c
@@ -1,6 +1,6 @@
#if !defined(lint) && !defined(SABER)
static char sccsid[] = "@(#)ns_main.c 4.55 (Berkeley) 7/1/91";
-static char rcsid[] = "$Id: ns_main.c,v 8.24 1996/11/26 10:11:22 vixie Exp $";
+static char rcsid[] = "$Id: ns_main.c,v 8.25 1997/06/01 20:34:34 vixie Exp $";
#endif /* not lint */
/*
@@ -172,7 +172,7 @@ main(argc, argv, envp)
const int on = 1;
int rfd, size, len;
time_t lasttime, maxctime;
- u_char buf[BUFSIZ];
+ u_char buf[PACKETSZ];
#ifdef NeXT
int old_sigmask;
#endif
@@ -833,7 +833,7 @@ main(argc, argv, envp)
malloc(rbufsize))
) {
sp->s_buf = buf;
- sp->s_size = sizeof(buf);
+ sp->s_bufsize=sizeof(buf);
} else {
sp->s_bufsize = rbufsize;
}
@@ -866,6 +866,12 @@ main(argc, argv, envp)
sp->s_bufp += n;
sp->s_size -= n;
}
+
+ if (sp->s_size > 0 &&
+ (n == -1) &&
+ (errno == PORT_WOULDBLK))
+ continue;
+
/*
* we don't have enough memory for the query.
* if we have a query id, then we will send an
@@ -886,8 +892,10 @@ main(argc, argv, envp)
(void) writemsg(sp->s_rfd, sp->s_buf,
HFIXEDSZ);
}
+ sqrm(sp);
continue;
}
+
/*
* If the message is too short to contain a valid
* header, try to send back an error, and drop the
@@ -908,10 +916,9 @@ main(argc, argv, envp)
(void) writemsg(sp->s_rfd, sp->s_buf,
HFIXEDSZ);
}
+ sqrm(sp);
continue;
}
- if ((n == -1) && (errno == PORT_WOULDBLK))
- continue;
if (n <= 0) {
sqrm(sp);
continue;
diff --git a/contrib/bind/named/ns_ncache.c b/contrib/bind/named/ns_ncache.c
index 9de1fc8..ff76bca 100644
--- a/contrib/bind/named/ns_ncache.c
+++ b/contrib/bind/named/ns_ncache.c
@@ -69,7 +69,7 @@ cache_n_resp(msg, msglen)
u_int16_t atype;
u_char *tp = cp;
u_char *cp1;
- u_char data[BUFSIZ+MAXDNAME];
+ u_char data[MAXDNAME*2 + INT32SZ*5];
size_t len = sizeof data;
/* we store NXDOMAIN as T_SOA regardless of the query type */
diff --git a/contrib/bind/named/ns_req.c b/contrib/bind/named/ns_req.c
index 1d7e39e..0ed1296 100644
--- a/contrib/bind/named/ns_req.c
+++ b/contrib/bind/named/ns_req.c
@@ -1,6 +1,6 @@
#if !defined(lint) && !defined(SABER)
static char sccsid[] = "@(#)ns_req.c 4.47 (Berkeley) 7/1/91";
-static char rcsid[] = "$Id: ns_req.c,v 8.27 1996/10/08 04:51:03 vixie Exp $";
+static char rcsid[] = "$Id: ns_req.c,v 8.28 1997/06/01 20:34:34 vixie Exp $";
#endif /* not lint */
/*
@@ -496,7 +496,7 @@ req_query(hp, cpp, eom, qsp, buflenp, msglenp, msg, dfd, from)
PUTLONG(0, *cpp); /* TTL */
tp = *cpp; /* Temp RdLength */
PUTSHORT(0, *cpp);
- copyCharString(cpp, Version);
+ copyCharString(cpp, ShortVersion);
PUTSHORT((*cpp) - (tp + INT16SZ), tp); /* Real RdLength */
*msglenp = *cpp - msg; /* Total message length */
return (Finish);
@@ -1693,7 +1693,7 @@ doaxfr(np, rfp, top, class)
struct namebuf *tnp; /* top namebuf */
struct databuf *tdp; /* top databuf */
struct namebuf **npp, **nppend;
- u_char msg[PACKETSZ];
+ u_char msg[64*1024];
u_char *cp;
const char *fname;
char dname[MAXDNAME];
@@ -2009,8 +2009,8 @@ startxfr(qsp, np, soa, soalen, class, dname)
*/
setsockopt(qsp->s_rfd, SOL_SOCKET, SO_LINGER,
(char *)&ll, sizeof ll);
- close(qsp->s_rfd);
#endif
+ close(qsp->s_rfd);
_exit(0);
/* NOTREACHED */
}
diff --git a/contrib/bind/named/ns_resp.c b/contrib/bind/named/ns_resp.c
index 71b60f9..d0f3221 100644
--- a/contrib/bind/named/ns_resp.c
+++ b/contrib/bind/named/ns_resp.c
@@ -1,6 +1,6 @@
#if !defined(lint) && !defined(SABER)
static char sccsid[] = "@(#)ns_resp.c 4.65 (Berkeley) 3/3/91";
-static char rcsid[] = "$Id: ns_resp.c,v 8.37 1996/12/02 09:17:21 vixie Exp $";
+static char rcsid[] = "$Id: ns_resp.c,v 8.38 1997/06/01 20:34:34 vixie Exp vixie $";
#endif /* not lint */
/*
@@ -126,6 +126,7 @@ struct flush_set {
int fs_class;
u_int fs_cred;
struct db_list *fs_list;
+ struct db_list *fs_last;
};
static void rrsetadd __P((struct flush_set *, char *,
@@ -136,7 +137,18 @@ static int rrsetcmp __P((char *, struct db_list *)),
check_root __P((void)),
check_ns __P((void)),
rrextract __P((u_char *, int, u_char *,
- struct databuf **, char *, int));
+ struct databuf **, char *, int,
+ char **));
+
+static void add_related_additional __P((char *));
+static void free_related_additional __P((void));
+static int related_additional __P((char *));
+static void maybe_free __P((char **));
+
+#define MAX_RELATED 100
+
+static int num_related = 0;
+static char *related[MAX_RELATED];
#ifdef LAME_LOGGING
static char *
@@ -230,11 +242,11 @@ ns_resp(msg, msglen)
struct flush_set *flushset;
struct sockaddr_in *nsa;
struct databuf *nsp[NSMAX];
- int i, c, n, qdcount, ancount, aucount, nscount, arcount;
+ int i, c, n, qdcount, ancount, aucount, nscount, arcount, arfirst;
int qtype, qclass, dbflags;
int restart; /* flag for processing cname response */
int validanswer;
- int cname, lastwascname;
+ int cname, lastwascname, externalcname;
int count, founddata, foundname;
int buflen;
int newmsglen;
@@ -250,6 +262,9 @@ ns_resp(msg, msglen)
struct namebuf *np;
struct netinfo *lp;
struct fwdinfo *fwd;
+ char *tname = NULL;
+
+ free_related_additional();
nameserIncr(from_addr.sin_addr, nssRcvdR);
nsp[0] = NULL;
@@ -688,7 +703,8 @@ ns_resp(msg, msglen)
/*
* Add the info received in the response to the data base.
*/
- c = ancount + aucount + arcount;
+ arfirst = ancount + aucount;
+ c = arfirst + arcount;
/* -ve $ing non-existence of record, must handle non-authoritative
* NOERRORs with c == 0.
@@ -752,6 +768,7 @@ ns_resp(msg, msglen)
nscount = 0;
cname = 0;
lastwascname = 0;
+ externalcname = 0;
strcpy(aname, qname);
if (count) {
@@ -767,12 +784,14 @@ ns_resp(msg, msglen)
struct databuf *dp;
int type;
+ maybe_free(&tname);
if (cp >= eom) {
formerrmsg = outofDataFinal;
goto formerr;
}
- n = rrextract(msg, msglen, cp, &dp, name, sizeof name);
+ n = rrextract(msg, msglen, cp, &dp, name, sizeof name, &tname);
if (n < 0) {
+ maybe_free(&tname);
formerrmsg = outofDataFinal;
goto formerr;
}
@@ -782,15 +801,23 @@ ns_resp(msg, msglen)
type = dp->d_type;
if (i < ancount) {
/* Answer section. */
- if (strcasecmp(name, aname) != 0) {
- syslog(LOG_DEBUG, "wrong ans. name (%s != %s)",
- name, aname);
+ if (externalcname || strcasecmp(name, aname) != 0) {
+ if (!externalcname)
+ syslog(LOG_DEBUG,
+ "wrong ans. name (%s != %s)",
+ name, aname);
+ else
+ dprintf(3, (ddt,
+ "ignoring answer '%s' after external cname\n",
+ name));
db_free(dp);
continue;
}
if (type == T_CNAME &&
qtype != T_CNAME && qtype != T_ANY) {
strcpy(aname, (char *)dp->d_data);
+ if (!samedomain(aname, qp->q_domain))
+ externalcname = 1;
cname = 1;
lastwascname = 1;
} else {
@@ -798,27 +825,95 @@ ns_resp(msg, msglen)
lastwascname = 0;
}
+ if (tname != NULL) {
+ add_related_additional(tname);
+ tname = NULL;
+ }
+
dp->d_cred = (hp->aa && !strcasecmp(name, qname))
? DB_C_AUTH
: DB_C_ANSWER;
} else {
/* After answer section. */
if (lastwascname) {
+ dprintf(3, (ddt,
+ "last was cname, ignoring auth. and add.\n"));
db_free(dp);
break;
}
- if (i < ancount + aucount && type == T_NS) {
+ if (i < arfirst) {
/* Authority section. */
- if (!samedomain(aname, name) ||
- (!cname && !samedomain(name, qp->q_domain))
- ) {
+ switch (type) {
+ case T_NS:
+ case T_SOA:
+ if (!samedomain(aname, name)){
+ syslog(LOG_DEBUG,
+ "bad referral (%s !< %s)",
+ aname[0] ? aname : ".",
+ name[0] ? name : ".");
+ db_free(dp);
+ continue;
+ } else if (!samedomain(name,
+ qp->q_domain)) {
+ if (!externalcname)
+ syslog(LOG_DEBUG,
+ "bad referral (%s !< %s)",
+ name[0] ? name : ".",
+ qp->q_domain[0] ?
+ qp->q_domain : ".");
+ db_free(dp);
+ continue;
+ }
+ if (type == T_NS) {
+ nscount++;
+ add_related_additional(tname);
+ tname = NULL;
+ }
+ break;
+ case T_NXT:
+ case T_SIG:
+ break;
+ default:
syslog(LOG_DEBUG,
- "bad referral (%s !< %s)",
- name, qp->q_domain);
+ "invalid RR type '%s' in authority section (name = '%s') from %s",
+ p_type(type), name,
+ sin_ntoa(&from_addr));
+ db_free(dp);
+ continue;
+ }
+ } else {
+ /* Additional section. */
+ switch (type) {
+ case T_A:
+ case T_AAAA:
+ if (externalcname ||
+ !samedomain(name, qp->q_domain)) {
+ dprintf(3, (ddt,
+ "ignoring additional info '%s' type %s\n",
+ name, p_type(type)));
+ db_free(dp);
+ continue;
+ }
+ if (!related_additional(name)) {
+ syslog(LOG_DEBUG,
+ "unrelated additional info '%s' type %s from %s",
+ name, p_type(type),
+ sin_ntoa(&from_addr));
+ db_free(dp);
+ continue;
+ }
+ break;
+ case T_KEY:
+ case T_SIG:
+ break;
+ default:
+ syslog(LOG_DEBUG,
+ "invalid RR type '%s' in additional section (name = '%s') from %s",
+ p_type(type), name,
+ sin_ntoa(&from_addr));
db_free(dp);
continue;
}
- nscount++;
}
dp->d_cred = (qp->q_flags & Q_PRIMING)
? DB_C_ANSWER
@@ -826,6 +921,7 @@ ns_resp(msg, msglen)
}
rrsetadd(flushset, name, dp);
}
+ maybe_free(&tname);
if (flushset) {
rrsetupdate(flushset, dbflags);
for (i = 0; i < count; i++)
@@ -833,7 +929,7 @@ ns_resp(msg, msglen)
free(flushset[i].fs_name);
free((char*)flushset);
}
- if (lastwascname)
+ if (lastwascname && !externalcname)
syslog(LOG_DEBUG, "%s (%s)", danglingCname, aname);
if (cp > eom) {
@@ -1100,7 +1196,11 @@ ns_resp(msg, msglen)
qp->q_fwd = fwdtab;
getname(np, tmpdomain, sizeof tmpdomain);
+ if (qp->q_domain != NULL)
+ free(qp->q_domain);
qp->q_domain = strdup(tmpdomain);
+ if (qp->q_domain == NULL)
+ panic(ENOMEM, "ns_resp: strdup failed");
if ((n = nslookup(nsp, qp, dname, "ns_resp")) <= 0) {
if (n < 0) {
@@ -1146,17 +1246,20 @@ ns_resp(msg, msglen)
qp->q_cmsglen = qp->q_msglen;
} else if (qp->q_msg)
(void) free(qp->q_msg);
- if ((qp->q_msg = (u_char *)malloc(BUFSIZ)) == NULL) {
+ if ((qp->q_msg = (u_char *)malloc(PACKETSZ)) == NULL) {
syslog(LOG_NOTICE, "resp: malloc error\n");
goto servfail;
}
n = res_mkquery(QUERY, dname, qclass, qtype,
- NULL, 0, NULL, qp->q_msg, BUFSIZ);
+ NULL, 0, NULL, qp->q_msg, PACKETSZ);
if (n < 0) {
syslog(LOG_INFO, "resp: res_mkquery(%s) failed",
dname);
goto servfail;
}
+ if (qp->q_name != NULL)
+ free(qp->q_name);
+ qp->q_name = savestr(dname);
qp->q_msglen = n;
hp = (HEADER *) qp->q_msg;
hp->rd = 0;
@@ -1255,29 +1358,35 @@ ns_resp(msg, msglen)
(void) send_msg((u_char *)hp, (qp->q_cmsglen ? qp->q_cmsglen : qp->q_msglen),
qp);
timeout:
+ if (qp->q_stream != QSTREAM_NULL)
+ sqrm(qp->q_stream);
qremove(qp);
free_nsp(nsp);
return;
}
static int
-rrextract(msg, msglen, rrp, dpp, dname, namelen)
+rrextract(msg, msglen, rrp, dpp, dname, namelen, tnamep)
u_char *msg;
int msglen;
u_char *rrp;
struct databuf **dpp;
char *dname;
int namelen;
+ char **tnamep;
{
register u_char *cp;
register int n;
int class, type, dlen, n1;
u_int32_t ttl;
u_char *cp1;
- u_char data[BUFSIZ];
+ u_char data[MAXDNAME*2 + INT32SZ*5];
register HEADER *hp = (HEADER *)msg;
enum context context;
+ if (tnamep != NULL)
+ *tnamep = NULL;
+
*dpp = NULL;
cp = rrp;
if ((n = dn_expand(msg, msg + msglen, cp, dname, namelen)) < 0) {
@@ -1362,6 +1471,8 @@ rrextract(msg, msglen, rrp, dpp, dname, namelen)
cp += n;
cp1 = data;
n = strlen((char *)data) + 1;
+ if (tnamep != NULL && (type == T_NS || type == T_MB))
+ *tnamep = strdup((char *)cp1);
break;
case T_SOA:
@@ -1469,7 +1580,7 @@ rrextract(msg, msglen, rrp, dpp, dname, namelen)
if (type == T_SRV) {
/* Grab weight and port. */
- bcopy(cp, data, INT16SZ*2);
+ bcopy(cp, cp1, INT16SZ*2);
cp1 += INT16SZ*2;
cp += INT16SZ*2;
}
@@ -1488,6 +1599,9 @@ rrextract(msg, msglen, rrp, dpp, dname, namelen)
}
cp += n;
+ if (tnamep != NULL)
+ *tnamep = strdup((char *)cp1);
+
/* compute end of data */
cp1 += strlen((char *)cp1) + 1;
/* compute size of data */
@@ -1647,12 +1761,12 @@ doupdate(msg, msglen, rrp, zone, savens, flags, cred)
int class, type;
struct databuf *dp;
char dname[MAXDNAME];
- u_char data[BUFSIZ+MAX_MD5RSA_KEY_BYTES];
dprintf(3, (ddt, "doupdate(zone %d, savens %#lx, flags %#lx)\n",
zone, (u_long)savens, (u_long)flags));
- if ((n = rrextract(msg, msglen, rrp, &dp, dname, sizeof(dname))) == -1)
+ if ((n = rrextract(msg, msglen, rrp, &dp, dname, sizeof(dname), NULL))
+ == -1)
return (-1);
if (!dp)
return (-1);
@@ -1673,7 +1787,7 @@ doupdate(msg, msglen, rrp, zone, savens, flags, cred)
}
#endif
if (!bogus &&
- ((temp = strrchr((char *)data, '.')) != NULL) &&
+ ((temp = strrchr((char *)dp->d_data, '.')) != NULL) &&
!strcasecmp(temp, ".arpa")
)
bogus++;
@@ -1688,7 +1802,7 @@ doupdate(msg, msglen, rrp, zone, savens, flags, cred)
"bogus root NS"))
syslog(LOG_NOTICE,
"bogus root NS %s rcvd from %s on query for \"%s\"",
- data, sin_ntoa(&from_addr), qname);
+ dp->d_data, sin_ntoa(&from_addr), qname);
db_free(dp);
return (cp - rrp);
}
@@ -1698,7 +1812,7 @@ doupdate(msg, msglen, rrp, zone, savens, flags, cred)
"bogus nonroot NS"))
syslog(LOG_INFO,
"bogus nonroot NS %s rcvd from %s on query for \"%s\"",
- data, sin_ntoa(&from_addr), qname);
+ dp->d_data, sin_ntoa(&from_addr), qname);
db_free(dp);
return (cp - rrp);
}
@@ -2019,17 +2133,19 @@ sysquery(dname, class, type, nss, nsc, opcode)
qp->q_flags |= Q_SYSTEM;
getname(np, tmpdomain, sizeof tmpdomain);
+ if (qp->q_domain != NULL)
+ free(qp->q_domain);
qp->q_domain = strdup(tmpdomain);
- if (!qp->q_domain)
+ if (qp->q_domain == NULL)
panic(ENOMEM, "ns_resp: strdup failed");
- if ((qp->q_msg = (u_char *)malloc(BUFSIZ)) == NULL) {
+ if ((qp->q_msg = (u_char *)malloc(PACKETSZ)) == NULL) {
syslog(LOG_NOTICE, "sysquery: malloc failed");
goto err2;
}
n = res_mkquery(opcode, dname, class,
type, NULL, 0, NULL,
- qp->q_msg, BUFSIZ);
+ qp->q_msg, PACKETSZ);
if (n < 0) {
syslog(LOG_INFO, "sysquery: res_mkquery(%s) failed", dname);
goto err2;
@@ -2728,19 +2844,25 @@ rrsetadd(flushset, name, dp)
fs->fs_type = dp->d_type;
fs->fs_cred = dp->d_cred;
fs->fs_list = NULL;
+ fs->fs_last = NULL;
}
dbl = (struct db_list *)malloc(sizeof(struct db_list));
if (!dbl)
panic(-1, "rrsetadd: out of memory");
- dbl->db_next = fs->fs_list;
+ dbl->db_next = NULL;
dbl->db_dp = dp;
- fs->fs_list = dbl;
+ if (fs->fs_last == NULL)
+ fs->fs_list = dbl;
+ else
+ fs->fs_last->db_next = dbl;
+ fs->fs_last = dbl;
}
static int
-ttlcheck(name,dbl)
+ttlcheck(name,dbl,update)
char *name;
struct db_list *dbl;
+ int update;
{
int type = dbl->db_dp->d_type;
int class = dbl->db_dp->d_class;
@@ -2764,6 +2886,9 @@ ttlcheck(name,dbl)
if (!match(dp, class, type))
continue;
if (first) {
+ /* we can't update zone data so return early */
+ if (dp->d_zone != 0)
+ return(0);
ttl = dp->d_ttl;
first = 0;
} else if (ttl != dp->d_ttl) {
@@ -2791,6 +2916,19 @@ ttlcheck(name,dbl)
}
dbp = dbp->db_next;
}
+
+ /* update ttl if required */
+ if (update) {
+ for (dp = np->n_data; dp != NULL; dp = dp->d_next) {
+ if (!match(dp, class, type))
+ continue;
+ if (dp->d_ttl > ttl)
+ break;
+ dp->d_ttl = ttl;
+ fixttl(dp);
+ }
+ }
+
return(1);
}
@@ -2871,8 +3009,8 @@ rrsetupdate(flushset, flags)
while (fs->fs_name) {
dprintf(1,(ddt, "rrsetupdate: %s\n",
fs->fs_name[0] ? fs->fs_name : "."));
- if ((n = rrsetcmp(fs->fs_name,fs->fs_list)) &&
- ttlcheck(fs->fs_name,fs->fs_list)) {
+ if ((n = rrsetcmp(fs->fs_name, fs->fs_list)) &&
+ ttlcheck(fs->fs_name, fs->fs_list, 0)) {
if (n > 0)
flushrrset(fs);
@@ -2889,6 +3027,8 @@ rrsetupdate(flushset, flags)
free((char *)odbp);
}
} else {
+ if (n == 0)
+ (void)ttlcheck(fs->fs_name, fs->fs_list, 1);
dbp = fs->fs_list;
while (dbp) {
db_free(dbp->db_dp);
@@ -2974,3 +3114,49 @@ delete_stale(np)
}
}
}
+
+
+static void
+add_related_additional(name)
+ char *name;
+{
+ int i;
+
+ if (num_related >= MAX_RELATED - 1)
+ return;
+ for (i = 0; i < num_related; i++)
+ if (strcasecmp(name, related[i]) == 0)
+ return;
+ related[num_related++] = name;
+}
+
+static void
+free_related_additional() {
+ int i;
+
+ for (i = 0; i < num_related; i++)
+ free(related[i]);
+ num_related = 0;
+}
+
+static int
+related_additional(name)
+ char *name;
+{
+ int i;
+
+ for (i = 0; i < num_related; i++)
+ if (strcasecmp(name, related[i]) == 0)
+ return (1);
+ return (0);
+}
+
+static void
+maybe_free(tname)
+ char **tname;
+{
+ if (tname == NULL || *tname == NULL)
+ return;
+ free(*tname);
+ *tname = NULL;
+}
diff --git a/contrib/bind/named/ns_validate.c b/contrib/bind/named/ns_validate.c
index 1192471..b7e774c 100644
--- a/contrib/bind/named/ns_validate.c
+++ b/contrib/bind/named/ns_validate.c
@@ -609,7 +609,7 @@ dovalidate(msg, msglen, rrp, zone, flags, qdomain, server, VCode)
u_int32_t ttl;
char dname[MAXDNAME];
u_char *cp1;
- u_char data[BUFSIZ];
+ u_char data[MAXDNAME*2 + INT32SZ*5];
register HEADER *hp = (HEADER *) msg;
dprintf(2, (ddt, "dovalidate(zone %d, flags %x)\n",
OpenPOWER on IntegriCloud