summaryrefslogtreecommitdiffstats
path: root/contrib/bind/lib
diff options
context:
space:
mode:
authordougb <dougb@FreeBSD.org>2003-06-17 08:25:13 +0000
committerdougb <dougb@FreeBSD.org>2003-06-17 08:25:13 +0000
commitf97237131f327c9eda67f546f7acffceef5a9fde (patch)
tree04f9050731919faa97a44a524d6a4129aea8e98d /contrib/bind/lib
parent02f065cde2cf18b6e76deab6f48d7aeb327bd639 (diff)
downloadFreeBSD-src-f97237131f327c9eda67f546f7acffceef5a9fde.zip
FreeBSD-src-f97237131f327c9eda67f546f7acffceef5a9fde.tar.gz
Import of ISC BIND version 8.3.6.
Version 8.3.5 was skipped due to bugs fixed in this version.
Diffstat (limited to 'contrib/bind/lib')
-rw-r--r--contrib/bind/lib/dst/bsafe_link.c4
-rw-r--r--contrib/bind/lib/dst/cylink_link.c4
-rw-r--r--contrib/bind/lib/dst/dst_api.c5
-rw-r--r--contrib/bind/lib/dst/hmac_link.c11
-rw-r--r--contrib/bind/lib/irs/dns_gr.c4
-rw-r--r--contrib/bind/lib/irs/dns_ho.c598
-rw-r--r--contrib/bind/lib/irs/dns_nw.c21
-rw-r--r--contrib/bind/lib/irs/gen_gr.c17
-rw-r--r--contrib/bind/lib/irs/getaddrinfo.c63
-rw-r--r--contrib/bind/lib/irs/gethostent.c59
-rw-r--r--contrib/bind/lib/irs/getnameinfo.c1
-rw-r--r--contrib/bind/lib/irs/getnetgrent.c27
-rw-r--r--contrib/bind/lib/irs/getnetgrent_r.c14
-rw-r--r--contrib/bind/lib/irs/hesiod.c26
-rw-r--r--contrib/bind/lib/irs/irp_p.h4
-rw-r--r--contrib/bind/lib/irs/irs_data.c25
-rw-r--r--contrib/bind/lib/irs/nis_gr.c4
-rw-r--r--contrib/bind/lib/irs/nis_ho.c107
-rw-r--r--contrib/bind/lib/isc/ctl_clnt.c4
-rw-r--r--contrib/bind/lib/isc/ctl_srvr.c4
-rw-r--r--contrib/bind/lib/isc/ev_files.c4
-rw-r--r--contrib/bind/lib/isc/ev_timers.c14
-rw-r--r--contrib/bind/lib/isc/ev_waits.c8
-rw-r--r--contrib/bind/lib/isc/eventlib.c16
-rw-r--r--contrib/bind/lib/isc/eventlib_p.h5
-rw-r--r--contrib/bind/lib/isc/logging.c11
-rw-r--r--contrib/bind/lib/nameser/ns_name.c32
-rw-r--r--contrib/bind/lib/nameser/ns_parse.c5
-rw-r--r--contrib/bind/lib/nameser/ns_print.c14
-rw-r--r--contrib/bind/lib/nameser/ns_samedomain.c14
-rw-r--r--contrib/bind/lib/nameser/ns_sign.c27
-rw-r--r--contrib/bind/lib/resolv/res_comp.c8
-rw-r--r--contrib/bind/lib/resolv/res_debug.c38
-rw-r--r--contrib/bind/lib/resolv/res_findzonecut.c113
-rw-r--r--contrib/bind/lib/resolv/res_init.c51
-rw-r--r--contrib/bind/lib/resolv/res_mkquery.c72
-rw-r--r--contrib/bind/lib/resolv/res_mkupdate.c68
-rw-r--r--contrib/bind/lib/resolv/res_private.h1
-rw-r--r--contrib/bind/lib/resolv/res_query.c9
-rw-r--r--contrib/bind/lib/resolv/res_send.c9
-rw-r--r--contrib/bind/lib/resolv/res_update.c15
41 files changed, 688 insertions, 848 deletions
diff --git a/contrib/bind/lib/dst/bsafe_link.c b/contrib/bind/lib/dst/bsafe_link.c
index 7c9e481..e1173c6 100644
--- a/contrib/bind/lib/dst/bsafe_link.c
+++ b/contrib/bind/lib/dst/bsafe_link.c
@@ -1,5 +1,5 @@
#if defined(BSAFE) || defined(DNSSAFE)
-static const char rcsid[] = "$Header: /proj/cvs/isc/bind8/src/lib/dst/bsafe_link.c,v 1.15 2001/09/25 04:50:28 marka Exp $";
+static const char rcsid[] = "$Header: /proj/cvs/isc/bind8/src/lib/dst/bsafe_link.c,v 1.16 2002/12/03 05:26:49 marka Exp $";
/*
* Portions Copyright (c) 1995-1998 by Trusted Information Systems, Inc.
@@ -1113,6 +1113,8 @@ T_realloc(POINTER block, unsigned int len)
}
#else /* BSAFE NOT available */
+#define dst_bsafe_init __dst_bsafe_init
+
int
dst_bsafe_init()
{
diff --git a/contrib/bind/lib/dst/cylink_link.c b/contrib/bind/lib/dst/cylink_link.c
index 6c2bdae..5d22074 100644
--- a/contrib/bind/lib/dst/cylink_link.c
+++ b/contrib/bind/lib/dst/cylink_link.c
@@ -1,5 +1,5 @@
#ifdef CYLINK_DSS
-static const char rcsid[] = "$Header: /proj/cvs/isc/bind8/src/lib/dst/cylink_link.c,v 1.9 2001/05/29 05:48:05 marka Exp $";
+static const char rcsid[] = "$Header: /proj/cvs/isc/bind8/src/lib/dst/cylink_link.c,v 1.10 2002/12/03 05:26:49 marka Exp $";
/*
* Portions Copyright (c) 1995-1998 by Trusted Information Systems, Inc.
@@ -662,6 +662,8 @@ memcpyend(void *dest, const void *src, size_t n, size_t size) {
}
#else
+#define dst_cylink_init __dst_cylink_init
+
int
dst_cylink_init()
{
diff --git a/contrib/bind/lib/dst/dst_api.c b/contrib/bind/lib/dst/dst_api.c
index cc2a7e4..e5f8cdb 100644
--- a/contrib/bind/lib/dst/dst_api.c
+++ b/contrib/bind/lib/dst/dst_api.c
@@ -1,5 +1,5 @@
#ifndef LINT
-static const char rcsid[] = "$Header: /proj/cvs/isc/bind8/src/lib/dst/dst_api.c,v 1.20 2001/07/26 01:20:08 marka Exp $";
+static const char rcsid[] = "$Header: /proj/cvs/isc/bind8/src/lib/dst/dst_api.c,v 1.21 2002/06/28 06:58:19 marka Exp $";
#endif
/*
@@ -217,7 +217,6 @@ dst_compare_keys(const DST_KEY *key1, const DST_KEY *key2)
* Then data is hashed (SIG_MODE_UPDATE). Finally the signature
* itself is created (SIG_MODE_FINAL). This function can be called
* once with INIT, UPDATE and FINAL modes all set, or it can be
-
* called separately with a different mode set for each step. The
* UPDATE step can be repeated.
* Parameters
@@ -457,7 +456,7 @@ dst_s_write_private_key(const DST_KEY *key)
* filename of the key file to be read.
* Returns
* NULL If the key does not exist or no name is supplied.
- * NON-NULL Initalized key structure if the key exists.
+ * NON-NULL Initialized key structure if the key exists.
*/
static DST_KEY *
diff --git a/contrib/bind/lib/dst/hmac_link.c b/contrib/bind/lib/dst/hmac_link.c
index 12e22a8..b689524 100644
--- a/contrib/bind/lib/dst/hmac_link.c
+++ b/contrib/bind/lib/dst/hmac_link.c
@@ -1,6 +1,6 @@
#ifdef HMAC_MD5
#ifndef LINT
-static const char rcsid[] = "$Header: /proj/cvs/isc/bind8/src/lib/dst/hmac_link.c,v 1.9 2001/05/29 05:48:10 marka Exp $";
+static const char rcsid[] = "$Header: /proj/cvs/isc/bind8/src/lib/dst/hmac_link.c,v 1.10 2002/12/03 05:26:49 marka Exp $";
#endif
/*
* Portions Copyright (c) 1995-1998 by Trusted Information Systems, Inc.
@@ -481,15 +481,10 @@ dst_hmac_md5_init()
}
#else
+#define dst_hmac_md5_init __dst_hmac_md5_init
+
int
dst_hmac_md5_init(){
return (0);
}
#endif
-
-
-
-
-
-
-
diff --git a/contrib/bind/lib/irs/dns_gr.c b/contrib/bind/lib/irs/dns_gr.c
index a622345..b314f11 100644
--- a/contrib/bind/lib/irs/dns_gr.c
+++ b/contrib/bind/lib/irs/dns_gr.c
@@ -16,7 +16,7 @@
*/
#if defined(LIBC_SCCS) && !defined(lint)
-static const char rcsid[] = "$Id: dns_gr.c,v 1.20 2001/05/29 05:48:27 marka Exp $";
+static const char rcsid[] = "$Id: dns_gr.c,v 1.21 2002/07/08 06:26:09 marka Exp $";
#endif
/*
@@ -226,7 +226,7 @@ get_hes_group(struct irs_gr *this, const char *name, const char *type) {
goto cleanup;
*cp++ = '\0';
- errno = -1;
+ errno = 0;
t = strtoul(cp, NULL, 10);
if (errno == ERANGE)
goto cleanup;
diff --git a/contrib/bind/lib/irs/dns_ho.c b/contrib/bind/lib/irs/dns_ho.c
index 6c0a6e7..1b37e3d 100644
--- a/contrib/bind/lib/irs/dns_ho.c
+++ b/contrib/bind/lib/irs/dns_ho.c
@@ -52,7 +52,7 @@
/* BIND Id: gethnamaddr.c,v 8.15 1996/05/22 04:56:30 vixie Exp $ */
#if defined(LIBC_SCCS) && !defined(lint)
-static const char rcsid[] = "$Id: dns_ho.c,v 1.39 2002/06/27 03:56:32 marka Exp $";
+static const char rcsid[] = "$Id: dns_ho.c,v 1.42.6.1 2003/06/02 09:24:40 marka Exp $";
#endif /* LIBC_SCCS and not lint */
/* Imports. */
@@ -95,7 +95,7 @@ static const char rcsid[] = "$Id: dns_ho.c,v 1.39 2002/06/27 03:56:32 marka Exp
#define MAXALIASES 35
#define MAXADDRS 35
-#define MAXPACKET (1024*64)
+#define MAXPACKET (65535) /* Maximum TCP message size */
#define BOUNDS_CHECK(ptr, count) \
if ((ptr) + (count) > eom) { \
@@ -172,15 +172,6 @@ static struct hostent * gethostans(struct irs_ho *this,
const struct addrinfo *pai);
static int add_hostent(struct pvt *pvt, char *bp, char **hap,
struct addrinfo *ai);
-static const u_char * ar_head(const u_char *, int, const u_char *,
- const u_char *, struct pvt *,
- int (*)(const char *));
-static struct addrinfo * a6_expand(const u_char *, const u_char *, int,
- const u_char *, const u_char *,
- const struct in6_addr *, int,
- const struct addrinfo *,
- struct pvt *, int (*)(const char *), int *);
-static const char *dname_subst(const char *, const char *, const char *);
static int init(struct irs_ho *this);
/* Exports. */
@@ -257,21 +248,19 @@ ho_byname2(struct irs_ho *this, const char *name, int af)
char tmp[NS_MAXDNAME];
const char *cp;
struct addrinfo ai;
- struct dns_res_target *q, *q2, *p;
+ struct dns_res_target *q, *p;
int querystate = RESQRY_FAIL;
if (init(this) == -1)
return (NULL);
q = memget(sizeof(*q));
- q2 = memget(sizeof(*q2));
- if (q == NULL || q2 == NULL) {
+ if (q == NULL) {
RES_SET_H_ERRNO(pvt->res, NETDB_INTERNAL);
errno = ENOMEM;
goto cleanup;
}
memset(q, 0, sizeof(q));
- memset(q2, 0, sizeof(q2));
switch (af) {
case AF_INET:
@@ -285,21 +274,10 @@ ho_byname2(struct irs_ho *this, const char *name, int af)
case AF_INET6:
size = IN6ADDRSZ;
q->qclass = C_IN;
- q->qtype = ns_t_a6;
+ q->qtype = T_AAAA;
q->answer = q->qbuf.buf;
q->anslen = sizeof(q->qbuf);
- q->next = q2;
-#ifdef RES_USE_A6
- if ((pvt->res->options & RES_USE_A6) == 0)
- q->action = RESTGT_IGNORE;
- else
-#endif
- q->action = RESTGT_DOALWAYS;
- q2->qclass = C_IN;
- q2->qtype = T_AAAA;
- q2->answer = q2->qbuf.buf;
- q2->anslen = sizeof(q2->qbuf);
- q2->action = RESTGT_AFTERFAILURE;
+ q->action = RESTGT_DOALWAYS;
break;
default:
RES_SET_H_ERRNO(pvt->res, NETDB_INTERNAL);
@@ -349,8 +327,6 @@ ho_byname2(struct irs_ho *this, const char *name, int af)
cleanup:
if (q != NULL)
memput(q, sizeof(*q));
- if (q2 != NULL)
- memput(q2, sizeof(*q2));
return(hp);
}
@@ -363,7 +339,7 @@ ho_byaddr(struct irs_ho *this, const void *addr, int len, int af)
struct hostent *hp = NULL;
struct addrinfo ai;
struct dns_res_target *q, *q2, *p;
- int n, size;
+ int n, size, i;
int querystate = RESQRY_FAIL;
if (init(this) == -1)
@@ -440,20 +416,36 @@ ho_byaddr(struct irs_ho *this, const void *addr, int len, int af)
if (q->action != RESTGT_IGNORE) {
qp = q->qname;
for (n = IN6ADDRSZ - 1; n >= 0; n--) {
- qp += SPRINTF((qp, "%x.%x.",
+ i = SPRINTF((qp, "%x.%x.",
uaddr[n] & 0xf,
(uaddr[n] >> 4) & 0xf));
+ if (i < 0)
+ abort();
+ qp += i;
}
+#ifdef HAVE_STRLCAT
+ strlcat(q->qname, res_get_nibblesuffix(pvt->res),
+ sizeof(q->qname));
+#else
strcpy(qp, res_get_nibblesuffix(pvt->res));
+#endif
}
if (q2->action != RESTGT_IGNORE) {
qp = q2->qname;
for (n = IN6ADDRSZ - 1; n >= 0; n--) {
- qp += SPRINTF((qp, "%x.%x.",
+ i = SPRINTF((qp, "%x.%x.",
uaddr[n] & 0xf,
(uaddr[n] >> 4) & 0xf));
+ if (i < 0)
+ abort();
+ qp += i;
}
+#ifdef HAVE_STRLCAT
+ strlcat(q->qname, res_get_nibblesuffix2(pvt->res),
+ sizeof(q->qname));
+#else
strcpy(qp, res_get_nibblesuffix2(pvt->res));
+#endif
}
break;
default:
@@ -563,7 +555,7 @@ ho_addrinfo(struct irs_ho *this, const char *name, const struct addrinfo *pai)
int n;
char tmp[NS_MAXDNAME];
const char *cp;
- struct dns_res_target *q, *q2, *q3, *p;
+ struct dns_res_target *q, *q2, *p;
struct addrinfo sentinel, *cur;
int querystate = RESQRY_FAIL;
@@ -575,42 +567,28 @@ ho_addrinfo(struct irs_ho *this, const char *name, const struct addrinfo *pai)
q = memget(sizeof(*q));
q2 = memget(sizeof(*q2));
- q3 = memget(sizeof(*q3));
- if (q == NULL || q2 == NULL || q3 == NULL) {
+ if (q == NULL || q2 == NULL) {
RES_SET_H_ERRNO(pvt->res, NETDB_INTERNAL);
errno = ENOMEM;
goto cleanup;
}
memset(q, 0, sizeof(q2));
memset(q2, 0, sizeof(q2));
- memset(q3, 0, sizeof(q3));
switch (pai->ai_family) {
case AF_UNSPEC:
/* prefer IPv6 */
q->qclass = C_IN;
- q->qtype = ns_t_a6;
+ q->qtype = T_AAAA;
q->answer = q->qbuf.buf;
q->anslen = sizeof(q->qbuf);
q->next = q2;
-#ifdef RES_USE_A6
- if ((pvt->res->options & RES_USE_A6) == 0)
- q->action = RESTGT_IGNORE;
- else
-#endif
- q->action = RESTGT_DOALWAYS;
+ q->action = RESTGT_DOALWAYS;
q2->qclass = C_IN;
- q2->qtype = T_AAAA;
+ q2->qtype = T_A;
q2->answer = q2->qbuf.buf;
q2->anslen = sizeof(q2->qbuf);
- q2->next = q3;
- /* try AAAA only when A6 query fails */
- q2->action = RESTGT_AFTERFAILURE;
- q3->qclass = C_IN;
- q3->qtype = T_A;
- q3->answer = q3->qbuf.buf;
- q3->anslen = sizeof(q3->qbuf);
- q3->action = RESTGT_DOALWAYS;
+ q2->action = RESTGT_DOALWAYS;
break;
case AF_INET:
q->qclass = C_IN;
@@ -621,21 +599,10 @@ ho_addrinfo(struct irs_ho *this, const char *name, const struct addrinfo *pai)
break;
case AF_INET6:
q->qclass = C_IN;
- q->qtype = ns_t_a6;
+ q->qtype = T_AAAA;
q->answer = q->qbuf.buf;
q->anslen = sizeof(q->qbuf);
- q->next = q2;
-#ifdef RES_USE_A6
- if ((pvt->res->options & RES_USE_A6) == 0)
- q->action = RESTGT_IGNORE;
- else
-#endif
- q->action = RESTGT_DOALWAYS;
- q2->qclass = C_IN;
- q2->qtype = T_AAAA;
- q2->answer = q2->qbuf.buf;
- q2->anslen = sizeof(q2->qbuf);
- q2->action = RESTGT_AFTERFAILURE;
+ q->action = RESTGT_DOALWAYS;
break;
default:
RES_SET_H_ERRNO(pvt->res, NO_RECOVERY); /* better error? */
@@ -688,375 +655,9 @@ ho_addrinfo(struct irs_ho *this, const char *name, const struct addrinfo *pai)
memput(q, sizeof(*q));
if (q2 != NULL)
memput(q2, sizeof(*q2));
- if (q3 != NULL)
- memput(q3, sizeof(*q3));
return(sentinel.ai_next);
}
-static const u_char *
-ar_head(cp, count, msg, eom, pvt, name_ok)
- const u_char *cp, *msg, *eom;
- int count;
- struct pvt *pvt;
- int (*name_ok)(const char *);
-{
- int n;
- char buf[1024]; /* XXX */
-
- while (count-- > 0 && cp < eom) {
- n = dn_expand(msg, eom, cp, buf, sizeof(buf));
- if (n < 0 || !maybe_ok(pvt->res, buf, name_ok))
- goto end;
- cp += n; /* name */
- if (cp + 3 * INT16SZ + INT32SZ >= eom)
- goto end;
- cp += INT16SZ; /* type */
- cp += INT16SZ + INT32SZ; /* class, TTL */
- n = ns_get16(cp);
- cp += n + INT16SZ; /* len */
- }
- return(cp);
-
- end:
- return(eom); /* XXX */
-}
-
-/* XXX: too many arguments */
-static struct addrinfo *
-a6_expand(const u_char *ansbuf, const u_char *a6p,
- int a6len, const u_char *arp, const u_char *eom,
- const struct in6_addr *in6, int plen, const struct addrinfo *pai,
- struct pvt *pvt, int (*name_ok)(const char *), int *errorp)
-{
- struct in6_addr a;
- int n, pbyte, plen1, pbyte1, error = 0;
- const u_char *cp;
- struct addrinfo sentinel, *cur;
- char pname[1024], buf[1024]; /* XXX */
-
- *errorp = NETDB_SUCCESS;
- memset(&sentinel, 0, sizeof(sentinel));
- cur = &sentinel;
-
- /*
- * Validate A6 parameters.
- */
- if (a6len == 0) { /* an A6 record must contain at least 1 byte. */
- error = NO_RECOVERY;
- goto bad;
- }
- /* prefix length check. */
- if ((plen1 = *a6p) > 128) {
- error = NO_RECOVERY;
- goto bad;
- }
- if (plen1 > plen) {
- /*
- * New length must not be greater than old one.
- * Ignore the record as specified in RFC 2874
- * Section 3.1.2.
- */
- return(NULL); /* just ignore. */
- }
- /* boundary check for new plen and prefix addr */
- pbyte1 = (plen1 & ~7) / 8;
- if ((int)sizeof(struct in6_addr) - pbyte1 > a6len - 1) {
- error = NO_RECOVERY;
- goto bad;
- }
-
- /*
- * merge the new prefix portion.
- * <--- plen(bits) --->
- * <--- pbyte ---><-b->
- * 000000000000000pppppxxxxxxxxxxx(= in6, 0: unknown, x: known, p: pad)
- * PP++++++++(+ should be merged. P: padding, must be 0)
- * <-- plen1-->
- * <-pbyte1->
- * ^a6p+1
- * The result should be:
- * 0000000000PP++++++++xxxxxxxxxxx(= a)
- */
- pbyte = (plen & ~7) / 8;
- a = *in6;
- if (pbyte > pbyte1) {
- /* N.B. the case of "pbyte1 == 128" is implicitly excluded. */
- int b = plen % 8; /* = the length of "pp..." above */
- u_char c_hi, c_lo;
-
- memcpy(&a.s6_addr[pbyte1], a6p + 1, pbyte - pbyte1);
- if (b > 0) {
- c_hi = a6p[pbyte - pbyte1 + 1];
- c_lo = in6->s6_addr[pbyte];
- a.s6_addr[pbyte] =
- (c_hi & (0xff << (8 - b))) |
- ((0x00ff >> b) & c_lo);
- }
- }
-
-#if 0 /* for debug */
- if ((pvt->res->options & RES_DEBUG) != 0) {
- u_char ntopbuf[INET6_ADDRSTRLEN];
-
- inet_ntop(AF_INET6, &a, ntopbuf, sizeof(ntopbuf));
- printf("a6_expand: %s\\%d\n", ntopbuf, plen1);
- }
-#endif
-
- if (plen1 == 0) {
- /* Here is the end of A6 chain. make addrinfo, then return. */
- return(addr2addrinfo(pai, (const char *)&a));
- }
-
- /*
- * Expand the new prefix name. Since the prefix name must not be
- * compressed (RFC 2874 Section 3.1.1), we could use ns_name_ntop()
- * here if it had a stricter boundary check.
- */
- cp = a6p + 1 + (sizeof(*in6) - pbyte1);
- n = dn_expand(ansbuf, eom, cp, pname, sizeof(pname));
- if (n < 0 || !maybe_ok(pvt->res, pname, name_ok)) {
- error = NO_RECOVERY;
- goto bad;
- }
- if (cp + n != a6p + a6len) { /* length mismatch */
- error = NO_RECOVERY;
- goto bad;
- }
-
- /*
- * we need (more) additional section records, but no one is
- * available, which possibly means a malformed answer.
- */
- if (arp == NULL) {
- error = NO_RECOVERY; /* we can't resolve the chain. */
- goto bad;
- }
-
- /*
- * Loop thru the rest of the buffer, searching for the next A6 record
- * that has the same owner name as the prefix name. If found, then
- * recursively call this function to expand the whole A6 chain.
- */
- plen = plen1;
- for (cp = arp; cp != NULL && cp < eom; cp += n) {
- int class, type;
-
- n = dn_expand(ansbuf, eom, cp, buf, sizeof(buf));
- if (n < 0 || !maybe_ok(pvt->res, buf, name_ok)) {
- error = NO_RECOVERY;
- goto bad;
- }
- cp += n; /* name */
- if (cp + 3 * INT16SZ + INT32SZ > eom) {
- error = NO_RECOVERY;
- goto bad;
- }
- type = ns_get16(cp);
- cp += INT16SZ; /* type */
- class = ns_get16(cp);
- cp += INT16SZ + INT32SZ; /* class, TTL */
- n = ns_get16(cp);
- cp += INT16SZ; /* len */
- if (cp + n > eom) {
- error = NO_RECOVERY;
- goto bad;
- }
- if (class != C_IN || type != ns_t_a6) {
- /* we are only interested in A6 records. skip others */
- continue;
- }
-
- if (ns_samename(buf, pname) != 1) {
- continue;
- }
-
- /* Proceed to the next record in the chain. */
- cur->ai_next = a6_expand(ansbuf, cp, n, cp + n, eom,
- (const struct in6_addr *)&a,
- plen, pai, pvt, name_ok, &error);
- if (error != NETDB_SUCCESS)
- goto bad;
- while (cur && cur->ai_next)
- cur = cur->ai_next;
- }
-
- return(sentinel.ai_next);
-
- bad:
- *errorp = error;
- if (sentinel.ai_next)
- freeaddrinfo(sentinel.ai_next);
- return(NULL);
-}
-
-static const char *
-dname_subst(const char *qname0, const char *owner0, const char *target) {
- char owner[MAXDNAME];
- static char qname[MAXDNAME];
- const char blabelhead[] = "\\[x"; /* we can assume hex strings */
- int qlen, olen;
- int bufsiz = sizeof(qname);
-
- /* make local copies, which are canonicalized. */
- if (ns_makecanon(qname0, qname, sizeof(qname)) < 0 ||
- ns_makecanon(owner0, owner, sizeof(owner)) < 0)
- return(NULL);
- qlen = strlen(qname);
- olen = strlen(owner);
- /* from now on, do not refer to qname0 nor owner0. */
-
- /*
- * check if QNAME is a subdomain of OWNER.
- * XXX: currently, we only handle the following two cases:
- * (A) none of the labels are bitlabels, or
- * (B) both of the head labels are bitlabels (and the following
- * labels are NOT bitlabels).
- * If we pass the check, then subtract the remaining part from QNAME.
- * ex. (A) qname=www.foo.com,owner=foo.com => new qname=www.
- * (B) qname=\[x3ffe0501/32].foo.com,owner=\[x3ffe/16].foo.com
- * => new qname=\[x0501/16].
- */
- if (ns_samedomain(qname, owner)) { /* check (A) */
- /* at this point, qlen must not be smaller than olen */
- qname[qlen - olen] = 0;
- bufsiz -= (qlen - olen);
- } else { /* check (B) */
- char *parent0, *parent1;
- /* the following 3 have enough size to store 1 bitlabel */
- u_char qlabel[64], olabel[64], newlabel[64];
- int qlabellen, olabellen;
-
- if (strncmp(qname, blabelhead, 3) != 0 ||
- strncmp(owner, blabelhead, 3) != 0)
- return(NULL);
- /*
- * Both two begin with bitlabels. The succeeding parts
- * must exact match.
- */
- if ((parent0 = strchr(qname, '.')) == NULL ||
- (parent1 = strchr(owner, '.')) == NULL)
- return(NULL);
-
- /* ns_samename allows names to begin with '.' */
- if (ns_samename(parent0, parent1) != 1)
- return(NULL);
-
- /* cut the upper domain parts off. */
- *(parent0 + 1) = 0;
- *(parent1 + 1) = 0;
- /* convert the textual form into binary one. */
- if (ns_name_pton(qname, qlabel, sizeof(qlabel)) < 0 ||
- ns_name_pton(owner, olabel, sizeof(olabel)) < 0)
- return(NULL);
- if ((qlabellen = *(qlabel + 1)) == 0)
- qlabellen = 256;
- if ((olabellen = *(olabel + 1)) == 0)
- olabellen = 256;
- if (olabellen > qlabellen)
- return(NULL); /* owner does not contain qname. */
- else {
- int qplen = (qlabellen + 7) / 8;
- int oplen = (olabellen + 7) / 8;
- int sft = olabellen % 8;
- int nllen, n;
- u_char *qp, *op, *np;
-
- /* skip ELT and Count. */
- qp = qlabel + 2;
- op = olabel + 2;
-
- /* check if olabel is a "subdomain" of qlabel. */
- if (memcmp(qp, op, oplen - 1) != 0)
- return(NULL);
- if (sft > 0) {
- /* compare trailing bits (between 1 and 7) */
- if ((qp[qplen - 1] & (0xff << sft)) !=
- op[qplen - 1])
- return(NULL);
- }
-
- /* OK, get remaining bits from qlabel. */
- np = newlabel;
- if (olabellen == qlabellen) {
- /*
- * Two names (including bitlabels) are exactly
- * same. Discard the whole names.
- * XXX: ns_samename() above should exclude
- * this case...
- */
- qname[0] = 0;
- goto maketarget;
- }
- *np++ = 0x41; /* XXX hardcoding */
- *np++ = nllen = (qlabellen - olabellen);
- if (sft == 0) {
- /*
- * No alignment issue. can just use memcpy.
- * Note that the "else" part below contains
- * this case. We separate the two cases just
- * for efficiency.
- * We assume that ns_name_pton above ensures
- * QP does not contain trailing garbages.
- */
- memcpy(np, qp + oplen, qplen - oplen);
- np += qplen - oplen;
- *np = 0;
- } else {
- /*
- * copy the lower (8-SFT) bits of QP to the
- * upper (8-SFT) bits of NP, then copy the
- * upper SFT bits of QP+1 to the lower SFT bits
- * of NP, and so on...
- * if QP is xxxyyyyy zzzwww..., then
- * NP would be yyyyyzzz ...
- * Again, we assume QP does not contain
- * trailing garbages.
- */
- qp += (oplen - 1);
- while (nllen > 0) {
- *np = (*qp << sft) & 0xff;
- if ((nllen -= (8 - sft)) <= 0)
- break; /* done */
- qp++;
- *np |= ((*qp >> sft) & 0xff);
- np++;
- nllen -= sft;
- }
- *++np = 0;
- }
-
- /*
- * make a new bitlabel with the remaining bits.
- * Note that there's no buffer boundary issue, since
- * qlabel, olabel, and newlabel all have the same size.
- * ns_name_ntop() must not return 0, since we have
- * a non-empty bitlabel.
- */
- if ((n = ns_name_ntop(newlabel, qname, sizeof(qname)))
- <= 0)
- return(NULL);
- bufsiz -= n;
- if (qname[n - 1] != '.') { /* XXX no trailing dot */
- qname[n - 1] = '.';
- qname[n] = 0;
- bufsiz--;
- }
-
- }
- }
-
- maketarget:
- /*
- * Finally, append the remaining part (maybe empty) to the new target.
- */
- if (bufsiz < (int)strlen(target)) /* bufsiz takes care of the \0. */
- return(NULL);
- strcat(qname, target);
-
- return((const char *)qname);
-}
-
static void
ho_res_set(struct irs_ho *this, struct __res_state *res,
void (*free_res)(void *)) {
@@ -1092,7 +693,6 @@ gethostans(struct irs_ho *this,
char *bp, *ep, **ap, **hap;
char tbuf[MAXDNAME+1];
struct addrinfo sentinel, *cur, ai;
- const u_char *arp = NULL;
if (pai == NULL) abort();
if (ret_aip != NULL)
@@ -1103,7 +703,6 @@ gethostans(struct irs_ho *this,
tname = qname;
eom = ansbuf + anslen;
switch (qtype) {
- case ns_t_a6:
case T_A:
case T_AAAA:
case T_ANY: /* use T_ANY only for T_A/T_AAAA lookup */
@@ -1148,8 +747,7 @@ gethostans(struct irs_ho *this,
RES_SET_H_ERRNO(pvt->res, NO_RECOVERY);
return (NULL);
}
- if (qtype == T_A || qtype == T_AAAA ||
- qtype == ns_t_a6 || qtype == T_ANY) {
+ if (qtype == T_A || qtype == T_AAAA || qtype == T_ANY) {
/* res_nsend() has already verified that the query name is the
* same as the one we sent; this just gets the expanded name
* (i.e., with the succeeding search-domain tacked on).
@@ -1193,8 +791,8 @@ gethostans(struct irs_ho *this,
continue;
}
eor = cp + n;
- if ((qtype == T_A || qtype == T_AAAA || qtype == ns_t_a6 ||
- qtype == T_ANY) && type == T_CNAME) {
+ if ((qtype == T_A || qtype == T_AAAA || qtype == T_ANY) &&
+ type == T_CNAME) {
if (haveanswer) {
int level = LOG_CRIT;
#ifdef LOG_SECURITY
@@ -1222,58 +820,16 @@ gethostans(struct irs_ho *this,
had_error++;
continue;
}
+#ifdef HAVE_STRLCPY
+ strlcpy(bp, tbuf, ep - bp);
+#else
strcpy(bp, tbuf);
+#endif
pvt->host.h_name = bp;
hname = bp;
bp += n;
continue;
}
- if (type == ns_t_dname) {
- const char *t0, *t;
-
- /*
- * just replace the query target; do not update the
- * alias list. (Or should we?)
- */
- t0 = (qtype == T_PTR) ? tname : hname;
-
- n = dn_expand(ansbuf, eor, cp, tbuf, sizeof(tbuf));
- if (n < 0 || !maybe_dnok(pvt->res, tbuf)) {
- had_error++;
- continue;
- }
-#ifdef RES_USE_DNAME
- if ((pvt ->res->options & RES_USE_DNAME) == 0) {
- cp += n;
- continue;
- }
-#endif
- if ((t = dname_subst(t0, bp, tbuf)) == NULL) {
- cp += n;
- continue;
- }
-#if 0 /* for debug */
- if ((pvt->res->options & RES_DEBUG) != 0) {
- printf("DNAME owner=%s, target=%s, next=%s\n",
- bp, tbuf, t);
- }
-#endif
- cp += n;
-
- n = strlen(t) + 1; /* for the \0 */
- if (n > (ep - bp)) {
- had_error++;
- continue;
- }
- strcpy(bp, t);
- if (qtype == T_PTR)
- tname = bp;
- else
- hname = bp;
- bp += n;
-
- continue;
- }
if (qtype == T_PTR && type == T_CNAME) {
n = dn_expand(ansbuf, eor, cp, tbuf, sizeof tbuf);
if (n < 0 || !maybe_dnok(pvt->res, tbuf)) {
@@ -1300,14 +856,17 @@ gethostans(struct irs_ho *this,
had_error++;
continue;
}
+#ifdef HAVE_STRLCPY
+ strlcpy(bp, tbuf, ep - bp);
+#else
strcpy(bp, tbuf);
+#endif
tname = bp;
bp += n;
continue;
}
if (qtype == T_ANY) {
- if (!(type == T_A || type == T_AAAA ||
- type == ns_t_a6)) {
+ if (!(type == T_A || type == T_AAAA)) {
cp += n;
continue;
}
@@ -1346,66 +905,6 @@ gethostans(struct irs_ho *this,
bp += n;
}
break;
- case ns_t_a6: {
- struct in6_addr in6;
- struct addrinfo ai;
-
-#ifdef RES_USE_A6
- if ((pvt->res->options & RES_USE_A6) == 0) {
- cp += n;
- continue;
- }
-#endif
-
- if (ns_samename(hname, bp) != 1) {
- cp += n;
- continue;
- }
-
- /*
- * search for the top of the additional section.
- * once found, keep it for the case where we have
- * more than one A6 record.
- * XXX: however, we may not need this part.
- */
- if (arp == NULL && arcount > 0) {
- int nscount = ntohs(hp->nscount);
-
- arp = ar_head(cp + n, nscount + ancount - 1,
- ansbuf, eom, pvt, name_ok);
- }
-
- /* recursively collect the whole A6 chain */
- ai = *pai; /* XXX: we can't override constant pai */
- ai.ai_family = AF_INET6;
- memset(&in6, 0, sizeof(in6)); /* just for safety */
- cur->ai_next = a6_expand(ansbuf, cp, n, arp, eom,
- &in6, 128,
- (const struct addrinfo *)&ai,
- pvt, name_ok, &error);
- if (error != NETDB_SUCCESS) {
-#ifdef DEBUG
- /* in this case, cur->ai_next must be NULL. */
- if (cur->ai_next != NULL)
- abort();
-#endif
- had_error++;
- continue;
- }
-
- /*
- * We don't bother even if cur->ai_next is NULL unless
- * the expansion failed by a fatal error. The list
- * can be NULL if the given A6 is incomplete, but we
- * may have another complete A6 chain in this answer.
- * See the last paragraph of RFC 2874 Section 3.1.4.
- */
- if (cur->ai_next == NULL) {
- cp += n;
- continue; /* no error, no answer */
- }
- goto convertinfo;
- } /* FALLTHROUGH */
case T_A:
case T_AAAA:
if (ns_samename(hname, bp) != 1) {
@@ -1430,7 +929,6 @@ gethostans(struct irs_ho *this,
if (cur->ai_next == NULL)
had_error++;
- convertinfo: /* convert addrinfo into hostent form */
if (!haveanswer) {
int nn;
@@ -1471,7 +969,7 @@ gethostans(struct irs_ho *this,
continue;
if (hap < &pvt->h_addr_ptrs[MAXADDRS-1])
hap++;
-
+ *hap = NULL;
bp += m;
}
@@ -1498,7 +996,11 @@ gethostans(struct irs_ho *this,
n = strlen(qname) + 1; /* for the \0 */
if (n > (ep - bp) || n >= MAXHOSTNAMELEN)
goto no_recovery;
+#ifdef HAVE_STRLCPY
+ strlcpy(bp, qname, ep - bp);
+#else
strcpy(bp, qname);
+#endif
pvt->host.h_name = bp;
bp += n;
}
diff --git a/contrib/bind/lib/irs/dns_nw.c b/contrib/bind/lib/irs/dns_nw.c
index f39a59a..a322f449 100644
--- a/contrib/bind/lib/irs/dns_nw.c
+++ b/contrib/bind/lib/irs/dns_nw.c
@@ -16,7 +16,7 @@
*/
#if defined(LIBC_SCCS) && !defined(lint)
-static const char rcsid[] = "$Id: dns_nw.c,v 1.23 2002/06/26 07:42:06 marka Exp $";
+static const char rcsid[] = "$Id: dns_nw.c,v 1.25 2002/07/18 02:07:43 marka Exp $";
#endif /* LIBC_SCCS and not lint */
/* Imports. */
@@ -349,7 +349,12 @@ get1101answer(struct irs_nw *this,
RES_SET_H_ERRNO(pvt->res, NO_RECOVERY);
return (NULL);
}
+#ifdef HAVE_STRLCPY
+ strlcpy(bp, name, ep - bp);
+ pvt->net.n_name = bp;
+#else
pvt->net.n_name = strcpy(bp, name);
+#endif
bp += n;
}
break;
@@ -522,37 +527,37 @@ get1101mask(struct irs_nw *this, struct nwent *nwent) {
static int
make1101inaddr(const u_char *net, int bits, char *name, int size) {
int n, m;
+ char *ep;
+
+ ep = name + size;
/* Zero fill any whole bytes left out of the prefix. */
for (n = (32 - bits) / 8; n > 0; n--) {
- if (size < (int)(sizeof "0."))
+ if (ep - name < (int)(sizeof "0."))
goto emsgsize;
m = SPRINTF((name, "0."));
name += m;
- size -= m;
}
/* Format the partial byte, if any, within the prefix. */
if ((n = bits % 8) != 0) {
- if (size < (int)(sizeof "255."))
+ if (ep - name < (int)(sizeof "255."))
goto emsgsize;
m = SPRINTF((name, "%u.",
net[bits / 8] & ~((1 << (8 - n)) - 1)));
name += m;
- size -= m;
}
/* Format the whole bytes within the prefix. */
for (n = bits / 8; n > 0; n--) {
- if (size < (int)(sizeof "255."))
+ if (ep - name < (int)(sizeof "255."))
goto emsgsize;
m = SPRINTF((name, "%u.", net[n - 1]));
name += m;
- size -= m;
}
/* Add the static text. */
- if (size < (int)(sizeof "in-addr.arpa"))
+ if (ep - name < (int)(sizeof "in-addr.arpa"))
goto emsgsize;
(void) SPRINTF((name, "in-addr.arpa"));
return (0);
diff --git a/contrib/bind/lib/irs/gen_gr.c b/contrib/bind/lib/irs/gen_gr.c
index 4b1b282..9a7af3d 100644
--- a/contrib/bind/lib/irs/gen_gr.c
+++ b/contrib/bind/lib/irs/gen_gr.c
@@ -16,7 +16,7 @@
*/
#if !defined(LINT) && !defined(CODECENTER)
-static const char rcsid[] = "$Id: gen_gr.c,v 1.25 2001/06/07 02:12:26 marka Exp $";
+static const char rcsid[] = "$Id: gen_gr.c,v 1.26 2002/07/18 02:07:44 marka Exp $";
#endif
/* Imports */
@@ -324,7 +324,7 @@ gr_res_set(struct irs_gr *this, struct __res_state *res,
static void
grmerge(struct irs_gr *this, const struct group *src, int preserve) {
struct pvt *pvt = (struct pvt *)this->private;
- char *cp, **m, **p, *oldmembuf;
+ char *cp, **m, **p, *oldmembuf, *ep;
int n, ndst, nnew;
size_t used;
@@ -379,6 +379,7 @@ grmerge(struct irs_gr *this, const struct group *src, int preserve) {
/* No harm done, no work done. */
return;
}
+ ep = cp + used + n;
if (used != 0)
memcpy(cp, pvt->membuf, used);
oldmembuf = pvt->membuf;
@@ -400,7 +401,11 @@ grmerge(struct irs_gr *this, const struct group *src, int preserve) {
if (isnew(pvt->group.gr_mem, *m)) {
*p++ = cp;
*p = NULL;
+#ifdef HAVE_STRLCPY
+ strlcpy(cp, *m, ep - cp);
+#else
strcpy(cp, *m);
+#endif
cp += strlen(cp) + 1;
}
if (preserve) {
@@ -410,10 +415,18 @@ grmerge(struct irs_gr *this, const struct group *src, int preserve) {
(pvt->group.gr_passwd - oldmembuf);
} else {
pvt->group.gr_name = cp;
+#ifdef HAVE_STRLCPY
+ strlcpy(cp, src->gr_name, ep - cp);
+#else
strcpy(cp, src->gr_name);
+#endif
cp += strlen(src->gr_name) + 1;
pvt->group.gr_passwd = cp;
+#ifdef HAVE_STRLCPY
+ strlcpy(cp, src->gr_passwd, ep - cp);
+#else
strcpy(cp, src->gr_passwd);
+#endif
cp += strlen(src->gr_passwd) + 1;
}
if (oldmembuf != NULL)
diff --git a/contrib/bind/lib/irs/getaddrinfo.c b/contrib/bind/lib/irs/getaddrinfo.c
index 243f106..89db519 100644
--- a/contrib/bind/lib/irs/getaddrinfo.c
+++ b/contrib/bind/lib/irs/getaddrinfo.c
@@ -101,17 +101,12 @@
#include <stdarg.h>
#include <irs.h>
+#include <isc/assertions.h>
#include "port_after.h"
#include "irs_data.h"
-/*
- * if we enable it, we will see duplicated addrinfo entries on reply if both
- * AAAA and A6 records are found. disable it for default installation.
- */
-#undef T_A6
-
#define SUCCESS 0
#define ANY 0
#define YES 1
@@ -192,7 +187,8 @@ static int get_portmatch __P((const struct addrinfo *, const char *));
static int get_port __P((const struct addrinfo *, const char *, int));
static const struct afd *find_afd __P((int));
static int addrconfig __P((int));
-static int ip6_str2scopeid __P((char *, struct sockaddr_in6 *));
+static int ip6_str2scopeid __P((char *, struct sockaddr_in6 *,
+ u_int32_t *scopeidp));
static struct net_data *init __P((void));
struct addrinfo *hostent2addrinfo __P((struct hostent *,
@@ -297,8 +293,9 @@ str_isnumber(p)
if (*p == '\0')
return NO;
ep = NULL;
+ errno = 0;
(void)strtoul(p, &ep, 10);
- if (ep && *ep == '\0')
+ if (errno == 0 && ep && *ep == '\0')
return YES;
else
return NO;
@@ -595,7 +592,7 @@ explore_fqdn(pai, hostname, servname, res)
char tmp[NS_MAXDNAME];
const char *cp;
- result = NULL;
+ INSIST(res != NULL && *res == NULL);
/*
* if the servname does not match socktype/protocol, ignore it.
@@ -854,13 +851,13 @@ explore_numeric_scope(pai, hostname, servname, res)
error = explore_numeric(pai, addr, servname, res);
if (error == 0) {
- int scopeid;
+ u_int32_t scopeid = 0;
for (cur = *res; cur; cur = cur->ai_next) {
if (cur->ai_family != AF_INET6)
continue;
sin6 = (struct sockaddr_in6 *)(void *)cur->ai_addr;
- if ((scopeid = ip6_str2scopeid(scope, sin6)) == -1) {
+ if (!ip6_str2scopeid(scope, sin6, &scopeid)) {
free(hostname2);
return(EAI_NONAME); /* XXX: is return OK? */
}
@@ -990,7 +987,17 @@ get_port(const struct addrinfo *ai, const char *servname, int matchonly) {
allownumeric = 1;
break;
case ANY:
- allownumeric = 0;
+ switch (ai->ai_family) {
+ case AF_INET:
+#ifdef AF_INET6
+ case AF_INET6:
+#endif
+ allownumeric = 1;
+ break;
+ default:
+ allownumeric = 0;
+ break;
+ }
break;
default:
return EAI_SOCKTYPE;
@@ -999,9 +1006,10 @@ get_port(const struct addrinfo *ai, const char *servname, int matchonly) {
if (str_isnumber(servname)) {
if (!allownumeric)
return EAI_SERVICE;
- port = htons(atoi(servname));
+ port = atoi(servname);
if (port < 0 || port > 65535)
return EAI_SERVICE;
+ port = htons(port);
} else {
switch (ai->ai_socktype) {
case SOCK_DGRAM:
@@ -1075,17 +1083,17 @@ addrconfig(af)
/* convert a string to a scope identifier. XXX: IPv6 specific */
static int
-ip6_str2scopeid(scope, sin6)
- char *scope;
- struct sockaddr_in6 *sin6;
+ip6_str2scopeid(char *scope, struct sockaddr_in6 *sin6,
+ u_int32_t *scopeidp)
{
- int scopeid;
+ u_int32_t scopeid;
+ u_long lscopeid;
struct in6_addr *a6 = &sin6->sin6_addr;
char *ep;
-
+
/* empty scopeid portion is invalid */
if (*scope == '\0')
- return -1;
+ return (0);
#ifdef USE_IFNAMELINKID
if (IN6_IS_ADDR_LINKLOCAL(a6) || IN6_IS_ADDR_MC_LINKLOCAL(a6)) {
@@ -1096,8 +1104,8 @@ ip6_str2scopeid(scope, sin6)
*/
scopeid = if_nametoindex(scope);
if (scopeid == 0)
- goto trynumeric;
- return(scopeid);
+ *scopeidp = scopeid;
+ return (1);
}
#endif
@@ -1111,11 +1119,14 @@ ip6_str2scopeid(scope, sin6)
/* try to convert to a numeric id as a last resort */
trynumeric:
- scopeid = (int)strtoul(scope, &ep, 10);
- if (*ep == '\0')
- return scopeid;
- else
- return -1;
+ errno = 0;
+ lscopeid = strtoul(scope, &ep, 10);
+ scopeid = lscopeid & 0xffffffff;
+ if (errno == 0 && ep && *ep == '\0' && scopeid == lscopeid) {
+ *scopeidp = scopeid;
+ return (1);
+ } else
+ return (0);
}
struct addrinfo *
diff --git a/contrib/bind/lib/irs/gethostent.c b/contrib/bind/lib/irs/gethostent.c
index 8e7e717..3964b5f 100644
--- a/contrib/bind/lib/irs/gethostent.c
+++ b/contrib/bind/lib/irs/gethostent.c
@@ -16,7 +16,7 @@
*/
#if !defined(LINT) && !defined(CODECENTER)
-static const char rcsid[] = "$Id: gethostent.c,v 1.32 2002/05/27 06:50:55 marka Exp $";
+static const char rcsid[] = "$Id: gethostent.c,v 1.32.10.2 2003/06/04 01:09:43 marka Exp $";
#endif
/* Imports */
@@ -482,7 +482,7 @@ freehostent(struct hostent *he) {
#define LIFREQ lifreq
#endif
-static int
+static void
scan_interfaces6(int *have_v4, int *have_v6) {
struct LIFCONF lifc;
struct LIFREQ lifreq;
@@ -492,12 +492,9 @@ scan_interfaces6(int *have_v4, int *have_v6) {
static unsigned int bufsiz = 4095;
int s, cpsize, n;
- /* Set to zero. Used as loop terminators below. */
- *have_v4 = *have_v6 = 0;
-
/* Get interface list from system. */
if ((s = socket(AF_INET6, SOCK_DGRAM, 0)) == -1)
- goto err_ret;
+ goto cleanup;
/*
* Grow buffer until large enough to contain all interface
@@ -506,7 +503,7 @@ scan_interfaces6(int *have_v4, int *have_v6) {
for (;;) {
buf = memget(bufsiz);
if (buf == NULL)
- goto err_ret;
+ goto cleanup;
#ifdef SETFAMILYFLAGS
lifc.lifc_family = AF_UNSPEC; /* request all families */
lifc.lifc_flags = 0;
@@ -526,10 +523,10 @@ scan_interfaces6(int *have_v4, int *have_v6) {
break;
}
if ((n == -1) && errno != EINVAL)
- goto err_ret;
+ goto cleanup;
if (bufsiz > 1000000)
- goto err_ret;
+ goto cleanup;
memput(buf, bufsiz);
bufsiz += 4096;
@@ -600,16 +597,42 @@ scan_interfaces6(int *have_v4, int *have_v6) {
memput(buf, bufsiz);
close(s);
/* printf("scan interface -> 4=%d 6=%d\n", *have_v4, *have_v6); */
- return (0);
- err_ret:
+ return;
+ cleanup:
if (buf != NULL)
memput(buf, bufsiz);
if (s != -1)
close(s);
/* printf("scan interface -> 4=%d 6=%d\n", *have_v4, *have_v6); */
- return (-1);
+ return;
}
+#endif
+#ifdef __linux
+#ifndef IF_NAMESIZE
+# ifdef IFNAMSIZ
+# define IF_NAMESIZE IFNAMSIZ
+# else
+# define IF_NAMESIZE 16
+# endif
+#endif
+static void
+scan_linux6(int *have_v6) {
+ FILE *proc = NULL;
+ char address[33];
+ char name[IF_NAMESIZE+1];
+ int ifindex, prefix, flag3, flag4;
+
+ proc = fopen("/proc/net/if_inet6", "r");
+ if (proc == NULL)
+ return;
+
+ if (fscanf(proc, "%32[a-f0-9] %x %x %x %x %16s\n",
+ address, &ifindex, &prefix, &flag3, &flag4, name) == 6)
+ *have_v6 = 1;
+ fclose(proc);
+ return;
+}
#endif
static int
@@ -626,17 +649,21 @@ scan_interfaces(int *have_v4, int *have_v6) {
int s, n;
size_t cpsize;
+ /* Set to zero. Used as loop terminators below. */
+ *have_v4 = *have_v6 = 0;
+
#if defined(SIOCGLIFCONF) && defined(SIOCGLIFADDR) && \
!defined(IRIX_EMUL_IOCTL_SIOCGIFCONF)
/*
* Try to scan the interfaces using IPv6 ioctls().
*/
- if (!scan_interfaces6(have_v4, have_v6))
+ scan_interfaces6(have_v4, have_v6);
+ if (*have_v4 != 0 && *have_v6 != 0)
return (0);
#endif
-
- /* Set to zero. Used as loop terminators below. */
- *have_v4 = *have_v6 = 0;
+#ifdef __linux
+ scan_linux6(have_v6);
+#endif
/* Get interface list from system. */
if ((s = socket(AF_INET, SOCK_DGRAM, 0)) == -1)
diff --git a/contrib/bind/lib/irs/getnameinfo.c b/contrib/bind/lib/irs/getnameinfo.c
index 9b26c64..702b932 100644
--- a/contrib/bind/lib/irs/getnameinfo.c
+++ b/contrib/bind/lib/irs/getnameinfo.c
@@ -44,6 +44,7 @@
#include <netinet/in.h>
#include <arpa/nameser.h>
#include <arpa/inet.h>
+#include <net/if.h>
#include <netdb.h>
#include <resolv.h>
diff --git a/contrib/bind/lib/irs/getnetgrent.c b/contrib/bind/lib/irs/getnetgrent.c
index e966ea6..9c13b01 100644
--- a/contrib/bind/lib/irs/getnetgrent.c
+++ b/contrib/bind/lib/irs/getnetgrent.c
@@ -16,7 +16,7 @@
*/
#if defined(LIBC_SCCS) && !defined(lint)
-static const char rcsid[] = "$Id: getnetgrent.c,v 1.15 2001/05/29 05:48:49 marka Exp $";
+static const char rcsid[] = "$Id: getnetgrent.c,v 1.16.6.1 2003/06/02 06:06:58 marka Exp $";
#endif /* LIBC_SCCS and not lint */
/* Imports */
@@ -47,8 +47,11 @@ static struct net_data *init(void);
/* Public */
+#ifndef SETNETGRENT_ARGS
+#define SETNETGRENT_ARGS const char *netgroup
+#endif
void
-setnetgrent(const char *netgroup) {
+setnetgrent(SETNETGRENT_ARGS) {
struct net_data *net_data = init();
setnetgrent_p(netgroup, net_data);
@@ -61,19 +64,31 @@ endnetgrent(void) {
endnetgrent_p(net_data);
}
+#ifndef INNETGR_ARGS
+#define INNETGR_ARGS const char *netgroup, const char *host, \
+ const char *user, const char *domain
+#endif
int
-innetgr(const char *netgroup, const char *host,
- const char *user, const char *domain) {
+innetgr(INNETGR_ARGS) {
struct net_data *net_data = init();
return (innetgr_p(netgroup, host, user, domain, net_data));
}
int
-getnetgrent(const char **host, const char **user, const char **domain) {
+getnetgrent(char **host, char **user, char **domain) {
struct net_data *net_data = init();
+ const char *ch, *cu, *cd;
+ int ret;
- return (getnetgrent_p(host, user, domain, net_data));
+ ret = getnetgrent_p(&ch, &cu, &cd, net_data);
+ if (ret != 1)
+ return (ret);
+
+ DE_CONST(ch, *host);
+ DE_CONST(cu, *user);
+ DE_CONST(cd, *domain);
+ return (ret);
}
/* Shared private. */
diff --git a/contrib/bind/lib/irs/getnetgrent_r.c b/contrib/bind/lib/irs/getnetgrent_r.c
index adae817..0a88ea4 100644
--- a/contrib/bind/lib/irs/getnetgrent_r.c
+++ b/contrib/bind/lib/irs/getnetgrent_r.c
@@ -16,7 +16,7 @@
*/
#if defined(LIBC_SCCS) && !defined(lint)
-static const char rcsid[] = "$Id: getnetgrent_r.c,v 8.6 2001/11/01 08:02:12 marka Exp $";
+static const char rcsid[] = "$Id: getnetgrent_r.c,v 8.6.10.1 2003/06/02 06:06:58 marka Exp $";
#endif /* LIBC_SCCS and not lint */
#include <port_before.h>
@@ -41,9 +41,15 @@ copy_protoent(char **, char **, char **, const char *, const char *,
NGR_R_RETURN
innetgr_r(const char *netgroup, const char *host, const char *user,
- const char *domain) {
+ const char *domain) {
+ char *ng, *ho, *us, *dom;
- return (innetgr(netgroup, host, user, domain));
+ DE_CONST(netgroup, ng);
+ DE_CONST(host, ho);
+ DE_CONST(user, us);
+ DE_CONST(domain, dom);
+
+ return (innetgr(ng, ho, us, dom));
}
/*
@@ -54,7 +60,7 @@ innetgr_r(const char *netgroup, const char *host, const char *user,
NGR_R_RETURN
getnetgrent_r(char **machinep, char **userp, char **domainp, NGR_R_ARGS) {
- const char *mp, *up, *dp;
+ char *mp, *up, *dp;
int res = getnetgrent(&mp, &up, &dp);
if (res != 1)
diff --git a/contrib/bind/lib/irs/hesiod.c b/contrib/bind/lib/irs/hesiod.c
index 2b08911..5afe661 100644
--- a/contrib/bind/lib/irs/hesiod.c
+++ b/contrib/bind/lib/irs/hesiod.c
@@ -1,5 +1,5 @@
#if defined(LIBC_SCCS) && !defined(lint)
-static const char rcsid[] = "$Id: hesiod.c,v 1.22 2001/05/29 05:48:55 marka Exp $";
+static const char rcsid[] = "$Id: hesiod.c,v 1.23 2002/07/18 02:07:45 marka Exp $";
#endif
/*
@@ -98,8 +98,13 @@ hesiod_init(void **context) {
errno = ENOMEM;
goto cleanup;
}
+#ifdef HAVE_STRLCPY
+ strlcpy(ctx->LHS, DEF_LHS, strlen(DEF_LHS) + 1);
+ strlcpy(ctx->RHS, DEF_RHS, strlen(DEF_RHS) + 1);
+#else
strcpy(ctx->LHS, DEF_LHS);
strcpy(ctx->RHS, DEF_RHS);
+#endif
#else
goto cleanup;
#endif
@@ -109,18 +114,31 @@ hesiod_init(void **context) {
* variable.
*/
if ((cp = getenv("HES_DOMAIN")) != NULL) {
+ size_t RHSlen = strlen(cp) + 2;
if (ctx->RHS)
free(ctx->RHS);
- ctx->RHS = malloc(strlen(cp)+2);
+ ctx->RHS = malloc(RHSlen);
if (!ctx->RHS) {
errno = ENOMEM;
goto cleanup;
}
- if (cp[0] == '.')
+ if (cp[0] == '.') {
+#ifdef HAVE_STRLCPY
+ strlcpy(ctx->RHS, cp, RHSlen);
+#else
strcpy(ctx->RHS, cp);
- else {
+#endif
+ } else {
+#ifdef HAVE_STRLCPY
+ strlcpy(ctx->RHS, ".", RHSlen);
+#else
strcpy(ctx->RHS, ".");
+#endif
+#ifdef HAVE_STRLCAT
+ strlcat(ctx->RHS, cp, RHSlen);
+#else
strcat(ctx->RHS, cp);
+#endif
}
}
diff --git a/contrib/bind/lib/irs/irp_p.h b/contrib/bind/lib/irs/irp_p.h
index 0f68b28..8a02b1b 100644
--- a/contrib/bind/lib/irs/irp_p.h
+++ b/contrib/bind/lib/irs/irp_p.h
@@ -16,7 +16,7 @@
*/
/*
- * $Id: irp_p.h,v 8.2 2001/08/10 02:40:52 marka Exp $
+ * $Id: irp_p.h,v 8.2.10.1 2003/06/02 05:55:14 marka Exp $
*/
#ifndef _IRP_P_H_INCLUDED
@@ -53,8 +53,6 @@ char *irs_irp_read_body(struct irp_p *pvt, size_t *size);
int irs_irp_get_full_response(struct irp_p *pvt, int *code,
char *text, size_t textlen,
char **body, size_t *bodylen);
-int irs_irp_send_command(struct irp_p *pvt, const char *fmt, ...) ISC_FORMAT_PRINTF(2, 3);
-
extern int irp_log_errors;
diff --git a/contrib/bind/lib/irs/irs_data.c b/contrib/bind/lib/irs/irs_data.c
index 000da0c..f69a6b4 100644
--- a/contrib/bind/lib/irs/irs_data.c
+++ b/contrib/bind/lib/irs/irs_data.c
@@ -16,7 +16,7 @@
*/
#if !defined(LINT) && !defined(CODECENTER)
-static const char rcsid[] = "$Id: irs_data.c,v 1.19 2001/08/20 07:08:41 marka Exp $";
+static const char rcsid[] = "$Id: irs_data.c,v 1.20.2.1 2003/06/02 10:09:48 marka Exp $";
#endif
#include "port_before.h"
@@ -38,6 +38,7 @@ static const char rcsid[] = "$Id: irs_data.c,v 1.19 2001/08/20 07:08:41 marka Ex
#endif
#include <irs.h>
+#include <stdlib.h>
#include "port_after.h"
@@ -97,6 +98,14 @@ net_data_destroy(void *p) {
(*net_data->ng->close)(net_data->ng);
net_data->ng = NULL;
}
+ if (net_data->ho_data != NULL) {
+ free(net_data->ho_data);
+ net_data->ho_data = NULL;
+ }
+ if (net_data->nw_data != NULL) {
+ free(net_data->nw_data);
+ net_data->nw_data = NULL;
+ }
(*net_data->irs->close)(net_data->irs);
memput(net_data, sizeof *net_data);
@@ -143,19 +152,27 @@ net_data_create(const char *conf_file) {
return (NULL);
memset(net_data, 0, sizeof (struct net_data));
- if ((net_data->irs = irs_gen_acc("", conf_file)) == NULL)
+ if ((net_data->irs = irs_gen_acc("", conf_file)) == NULL) {
+ memput(net_data, sizeof (struct net_data));
return (NULL);
+ }
#ifndef DO_PTHREADS
(*net_data->irs->res_set)(net_data->irs, &_res, NULL);
#endif
net_data->res = (*net_data->irs->res_get)(net_data->irs);
- if (net_data->res == NULL)
+ if (net_data->res == NULL) {
+ (*net_data->irs->close)(net_data->irs);
+ memput(net_data, sizeof (struct net_data));
return (NULL);
+ }
if ((net_data->res->options & RES_INIT) == 0 &&
- res_ninit(net_data->res) == -1)
+ res_ninit(net_data->res) == -1) {
+ (*net_data->irs->close)(net_data->irs);
+ memput(net_data, sizeof (struct net_data));
return (NULL);
+ }
return (net_data);
}
diff --git a/contrib/bind/lib/irs/nis_gr.c b/contrib/bind/lib/irs/nis_gr.c
index b4e0945..0ea50f5 100644
--- a/contrib/bind/lib/irs/nis_gr.c
+++ b/contrib/bind/lib/irs/nis_gr.c
@@ -49,7 +49,7 @@
*/
#if defined(LIBC_SCCS) && !defined(lint)
-static const char rcsid[] = "$Id: nis_gr.c,v 1.21 2001/05/29 05:49:12 marka Exp $";
+static const char rcsid[] = "$Id: nis_gr.c,v 1.22 2002/07/08 06:26:11 marka Exp $";
/* from getgrent.c 8.2 (Berkeley) 3/21/94"; */
/* from BSDI Id: getgrent.c,v 2.8 1996/05/28 18:15:14 bostic Exp $ */
#endif /* LIBC_SCCS and not lint */
@@ -286,7 +286,7 @@ makegroupent(struct irs_gr *this) {
goto cleanup;
*cp++ = '\0';
- errno = -1;
+ errno = 0;
t = strtoul(cp, NULL, 10);
if (errno == ERANGE)
goto cleanup;
diff --git a/contrib/bind/lib/irs/nis_ho.c b/contrib/bind/lib/irs/nis_ho.c
index 72a8d17..7158f4c 100644
--- a/contrib/bind/lib/irs/nis_ho.c
+++ b/contrib/bind/lib/irs/nis_ho.c
@@ -16,7 +16,7 @@
*/
#if defined(LIBC_SCCS) && !defined(lint)
-static const char rcsid[] = "$Id: nis_ho.c,v 1.18 2001/06/18 14:44:00 marka Exp $";
+static const char rcsid[] = "$Id: nis_ho.c,v 1.18.10.1 2003/06/02 05:50:57 marka Exp $";
#endif /* LIBC_SCCS and not lint */
/* Imports */
@@ -87,6 +87,9 @@ static const u_char mapped[] = { 0,0, 0,0, 0,0, 0,0, 0,0, 0xff,0xff };
static const u_char tunnelled[] = { 0,0, 0,0, 0,0, 0,0, 0,0, 0,0 };
static /*const*/ char hosts_byname[] = "hosts.byname";
static /*const*/ char hosts_byaddr[] = "hosts.byaddr";
+static /*const*/ char ipnode_byname[] = "ipnode.byname";
+static /*const*/ char ipnode_byaddr[] = "ipnode.byaddr";
+static /*const*/ char yp_multi[] = "YP_MULTI_";
/* Forwards */
@@ -186,10 +189,33 @@ ho_byname2(struct irs_ho *this, const char *name, int af) {
return (NULL);
nisfree(pvt, do_val);
- DE_CONST(name, tmp);
- r = yp_match(pvt->nis_domain, hosts_byname, tmp,
+
+ strcpy(pvt->hostbuf, yp_multi);
+ strncat(pvt->hostbuf, name, sizeof(pvt->hostbuf) - sizeof(yp_multi));
+ pvt->hostbuf[sizeof(pvt->hostbuf) - 1] = '\0';
+ for (r = sizeof(yp_multi) - 1; pvt->hostbuf[r] != '\0'; r++)
+ if (isupper((unsigned char)pvt->hostbuf[r]))
+ tolower(pvt->hostbuf[r]);
+
+ tmp = pvt->hostbuf;
+ r = yp_match(pvt->nis_domain, ipnode_byname, tmp,
strlen(tmp), &pvt->curval_data, &pvt->curval_len);
if (r != 0) {
+ tmp = pvt->hostbuf + sizeof(yp_multi) - 1;
+ r = yp_match(pvt->nis_domain, ipnode_byname, tmp,
+ strlen(tmp), &pvt->curval_data, &pvt->curval_len);
+ }
+ if (r != 0) {
+ tmp = pvt->hostbuf;
+ r = yp_match(pvt->nis_domain, hosts_byname, tmp,
+ strlen(tmp), &pvt->curval_data, &pvt->curval_len);
+ }
+ if (r != 0) {
+ tmp = pvt->hostbuf + sizeof(yp_multi) - 1;
+ r = yp_match(pvt->nis_domain, hosts_byname, tmp,
+ strlen(tmp), &pvt->curval_data, &pvt->curval_len);
+ }
+ if (r != 0) {
RES_SET_H_ERRNO(pvt->res, HOST_NOT_FOUND);
return (NULL);
}
@@ -220,8 +246,11 @@ ho_byaddr(struct irs_ho *this, const void *addr, int len, int af) {
return (NULL);
}
nisfree(pvt, do_val);
- r = yp_match(pvt->nis_domain, hosts_byaddr, tmp, strlen(tmp),
+ r = yp_match(pvt->nis_domain, ipnode_byaddr, tmp, strlen(tmp),
&pvt->curval_data, &pvt->curval_len);
+ if (r != 0)
+ r = yp_match(pvt->nis_domain, hosts_byaddr, tmp, strlen(tmp),
+ &pvt->curval_data, &pvt->curval_len);
if (r != 0) {
RES_SET_H_ERRNO(pvt->res, HOST_NOT_FOUND);
return (NULL);
@@ -382,12 +411,35 @@ ho_addrinfo(struct irs_ho *this, const char *name, const struct addrinfo *pai)
/* Private */
+/*
+ipnodes:
+::1 localhost
+127.0.0.1 localhost
+1.2.3.4 FOO bar
+1.2.6.4 FOO bar
+1.2.6.5 host
+
+ipnodes.byname:
+YP_MULTI_localhost ::1,127.0.0.1 localhost
+YP_MULTI_foo 1.2.3.4,1.2.6.4 FOO bar
+YP_MULTI_bar 1.2.3.4,1.2.6.4 FOO bar
+host 1.2.6.5 host
+
+hosts.byname:
+localhost 127.0.0.1 localhost
+host 1.2.6.5 host
+YP_MULTI_foo 1.2.3.4,1.2.6.4 FOO bar
+YP_MULTI_bar 1.2.3.4,1.2.6.4 FOO bar
+*/
+
static struct hostent *
makehostent(struct irs_ho *this) {
struct pvt *pvt = (struct pvt *)this->private;
static const char spaces[] = " \t";
- char *cp, **q, *p;
- int af, len;
+ char *cp, **q, *p, *comma, *ap;
+ int af = 0, len = 0;
+ int multi = 0;
+ int addr = 0;
p = pvt->curval_data;
if ((cp = strpbrk(p, "#\n")) != NULL)
@@ -395,25 +447,40 @@ makehostent(struct irs_ho *this) {
if (!(cp = strpbrk(p, spaces)))
return (NULL);
*cp++ = '\0';
- if ((pvt->res->options & RES_USE_INET6) &&
- inet_pton(AF_INET6, p, pvt->host_addr) > 0) {
- af = AF_INET6;
- len = IN6ADDRSZ;
- } else if (inet_pton(AF_INET, p, pvt->host_addr) > 0) {
- if (pvt->res->options & RES_USE_INET6) {
- map_v4v6_address((char*)pvt->host_addr,
- (char*)pvt->host_addr);
+ ap = pvt->hostbuf;
+ do {
+ if ((comma = strchr(p, ',')) != NULL) {
+ *comma++ = '\0';
+ multi = 1;
+ }
+ if ((ap + IN6ADDRSZ) > (pvt->hostbuf + sizeof(pvt->hostbuf)))
+ break;
+ if ((pvt->res->options & RES_USE_INET6) &&
+ inet_pton(AF_INET6, p, ap) > 0) {
af = AF_INET6;
len = IN6ADDRSZ;
+ } else if (inet_pton(AF_INET, p, pvt->host_addr) > 0) {
+ if (pvt->res->options & RES_USE_INET6) {
+ map_v4v6_address((char*)pvt->host_addr, ap);
+ af = AF_INET6;
+ len = IN6ADDRSZ;
+ } else {
+ af = AF_INET;
+ len = INADDRSZ;
+ }
} else {
- af = AF_INET;
- len = INADDRSZ;
+ if (!multi)
+ return (NULL);
+ continue;
+ }
+ if (addr < MAXADDRS) {
+ pvt->h_addr_ptrs[addr++] = ap;
+ pvt->h_addr_ptrs[addr] = NULL;
+ ap += len;
}
- } else {
+ } while ((p = comma) != NULL);
+ if (ap == pvt->hostbuf)
return (NULL);
- }
- pvt->h_addr_ptrs[0] = (char *)pvt->host_addr;
- pvt->h_addr_ptrs[1] = NULL;
pvt->host.h_addr_list = pvt->h_addr_ptrs;
pvt->host.h_length = len;
pvt->host.h_addrtype = af;
diff --git a/contrib/bind/lib/isc/ctl_clnt.c b/contrib/bind/lib/isc/ctl_clnt.c
index 56e5098..13d71d5 100644
--- a/contrib/bind/lib/isc/ctl_clnt.c
+++ b/contrib/bind/lib/isc/ctl_clnt.c
@@ -1,5 +1,5 @@
#if !defined(lint) && !defined(SABER)
-static const char rcsid[] = "$Id: ctl_clnt.c,v 8.17 2001/06/06 00:33:35 marka Exp $";
+static const char rcsid[] = "$Id: ctl_clnt.c,v 8.18 2002/07/08 05:10:23 marka Exp $";
#endif /* not lint */
/*
@@ -185,7 +185,7 @@ ctl_client(evContext lev, const struct sockaddr *cap, size_t cap_len,
if (evConnect(lev, ctx->sock, (const struct sockaddr *)sap, sap_len,
conn_done, ctx, &ctx->coID) < 0) {
(*ctx->logger)(ctl_error, "%s: evConnect(fd %d): %s",
- me, (void *)ctx->sock, strerror(errno));
+ me, ctx->sock, strerror(errno));
fatal:
if (ctx != NULL) {
if (ctx->sock >= 0)
diff --git a/contrib/bind/lib/isc/ctl_srvr.c b/contrib/bind/lib/isc/ctl_srvr.c
index 91a2c1b..835bcd4 100644
--- a/contrib/bind/lib/isc/ctl_srvr.c
+++ b/contrib/bind/lib/isc/ctl_srvr.c
@@ -1,5 +1,5 @@
#if !defined(lint) && !defined(SABER)
-static const char rcsid[] = "$Id: ctl_srvr.c,v 8.25 2001/05/29 05:49:27 marka Exp $";
+static const char rcsid[] = "$Id: ctl_srvr.c,v 8.26 2002/07/08 05:10:25 marka Exp $";
#endif /* not lint */
/*
@@ -252,7 +252,7 @@ ctl_server(evContext lev, const struct sockaddr *sap, size_t sap_len,
&ctx->acID) < 0) {
save_errno = errno;
(*ctx->logger)(ctl_error, "%s: evListen(fd %d): %s",
- me, (void *)ctx->sock, strerror(errno));
+ me, ctx->sock, strerror(errno));
close(ctx->sock);
memput(ctx, sizeof *ctx);
errno = save_errno;
diff --git a/contrib/bind/lib/isc/ev_files.c b/contrib/bind/lib/isc/ev_files.c
index c6bcab6..3a6894b 100644
--- a/contrib/bind/lib/isc/ev_files.c
+++ b/contrib/bind/lib/isc/ev_files.c
@@ -20,7 +20,7 @@
*/
#if !defined(LINT) && !defined(CODECENTER)
-static const char rcsid[] = "$Id: ev_files.c,v 1.21 2001/11/01 05:35:46 marka Exp $";
+static const char rcsid[] = "$Id: ev_files.c,v 1.22 2002/07/08 05:50:07 marka Exp $";
#endif
#include "port_before.h"
@@ -54,7 +54,7 @@ evSelectFD(evContext opaqueCtx,
int mode;
evPrintf(ctx, 1,
- "evSelectFD(ctx %#x, fd %d, mask 0x%x, func %#x, uap %#x)\n",
+ "evSelectFD(ctx %p, fd %d, mask 0x%x, func %p, uap %p)\n",
ctx, fd, eventmask, func, uap);
if (eventmask == 0 || (eventmask & ~EV_MASK_ALL) != 0)
EV_ERR(EINVAL);
diff --git a/contrib/bind/lib/isc/ev_timers.c b/contrib/bind/lib/isc/ev_timers.c
index 03436c6..0f3c56f 100644
--- a/contrib/bind/lib/isc/ev_timers.c
+++ b/contrib/bind/lib/isc/ev_timers.c
@@ -20,7 +20,7 @@
*/
#if !defined(LINT) && !defined(CODECENTER)
-static const char rcsid[] = "$Id: ev_timers.c,v 1.32 2001/11/01 05:35:47 marka Exp $";
+static const char rcsid[] = "$Id: ev_timers.c,v 1.33 2002/07/08 05:50:09 marka Exp $";
#endif
/* Import. */
@@ -152,10 +152,10 @@ evSetTimer(evContext opaqueCtx,
evTimer *id;
evPrintf(ctx, 1,
-"evSetTimer(ctx %#x, func %#x, uap %#x, due %d.%09ld, inter %d.%09ld)\n",
+"evSetTimer(ctx %p, func %p, uap %p, due %ld.%09ld, inter %ld.%09ld)\n",
ctx, func, uap,
- due.tv_sec, due.tv_nsec,
- inter.tv_sec, inter.tv_nsec);
+ (long)due.tv_sec, due.tv_nsec,
+ (long)inter.tv_sec, inter.tv_nsec);
/* due={0,0} is a magic cookie meaning "now." */
if (due.tv_sec == 0 && due.tv_nsec == 0L)
@@ -379,10 +379,10 @@ print_timer(void *what, void *uap) {
cur = what;
evPrintf(ctx, 7,
- " func %p, uap %p, due %d.%09ld, inter %d.%09ld\n",
+ " func %p, uap %p, due %ld.%09ld, inter %ld.%09ld\n",
cur->func, cur->uap,
- cur->due.tv_sec, cur->due.tv_nsec,
- cur->inter.tv_sec, cur->inter.tv_nsec);
+ (long)cur->due.tv_sec, cur->due.tv_nsec,
+ (long)cur->inter.tv_sec, cur->inter.tv_nsec);
}
static void
diff --git a/contrib/bind/lib/isc/ev_waits.c b/contrib/bind/lib/isc/ev_waits.c
index 9608424..8d9fa8d 100644
--- a/contrib/bind/lib/isc/ev_waits.c
+++ b/contrib/bind/lib/isc/ev_waits.c
@@ -20,7 +20,7 @@
*/
#if !defined(LINT) && !defined(CODECENTER)
-static const char rcsid[] = "$Id: ev_waits.c,v 8.11 2000/07/20 18:17:52 vixie Exp $";
+static const char rcsid[] = "$Id: ev_waits.c,v 8.12 2002/07/08 05:50:10 marka Exp $";
#endif
#include "port_before.h"
@@ -190,14 +190,14 @@ print_waits(evContext_p *ctx) {
evPrintf(ctx, 9, "wait waiting:\n");
for (wl = ctx->waitLists; wl != NULL; wl = wl->next) {
INSIST(wl->first != NULL);
- evPrintf(ctx, 9, " tag %#x:", wl->first->tag);
+ evPrintf(ctx, 9, " tag %p:", wl->first->tag);
for (this = wl->first; this != NULL; this = this->next)
- evPrintf(ctx, 9, " %#x", this);
+ evPrintf(ctx, 9, " %p", this);
evPrintf(ctx, 9, "\n");
}
evPrintf(ctx, 9, "wait done:");
for (this = ctx->waitDone.first; this != NULL; this = this->next)
- evPrintf(ctx, 9, " %#x", this);
+ evPrintf(ctx, 9, " %p", this);
evPrintf(ctx, 9, "\n");
}
diff --git a/contrib/bind/lib/isc/eventlib.c b/contrib/bind/lib/isc/eventlib.c
index 0e52733..c7b1272 100644
--- a/contrib/bind/lib/isc/eventlib.c
+++ b/contrib/bind/lib/isc/eventlib.c
@@ -20,7 +20,7 @@
*/
#if !defined(LINT) && !defined(CODECENTER)
-static const char rcsid[] = "$Id: eventlib.c,v 1.46 2001/11/01 05:35:48 marka Exp $";
+static const char rcsid[] = "$Id: eventlib.c,v 1.48 2002/07/17 07:37:34 marka Exp $";
#endif
#include "port_before.h"
@@ -291,12 +291,12 @@ evGetNext(evContext opaqueCtx, evEvent *opaqueEv, int options) {
}
evPrintf(ctx, 4,
- "pselect(%d, 0x%lx, 0x%lx, 0x%lx, %d.%09ld)\n",
+ "pselect(%d, 0x%lx, 0x%lx, 0x%lx, %ld.%09ld)\n",
ctx->fdMax+1,
(u_long)ctx->rdLast.fds_bits[0],
(u_long)ctx->wrLast.fds_bits[0],
(u_long)ctx->exLast.fds_bits[0],
- tp ? tp->tv_sec : -1,
+ tp ? (long)tp->tv_sec : -1L,
tp ? tp->tv_nsec : -1);
/* XXX should predict system's earliness and adjust. */
@@ -463,7 +463,7 @@ evDispatch(evContext opaqueCtx, evEvent opaqueEv) {
evAccept *this = ev->u.accept.this;
evPrintf(ctx, 5,
- "Dispatch.Accept: fd %d -> %d, func %#x, uap %#x\n",
+ "Dispatch.Accept: fd %d -> %d, func %p, uap %p\n",
this->conn->fd, this->fd,
this->conn->func, this->conn->uap);
errno = this->ioErrno;
@@ -480,7 +480,7 @@ evDispatch(evContext opaqueCtx, evEvent opaqueEv) {
int eventmask = ev->u.file.eventmask;
evPrintf(ctx, 5,
- "Dispatch.File: fd %d, mask 0x%x, func %#x, uap %#x\n",
+ "Dispatch.File: fd %d, mask 0x%x, func %p, uap %p\n",
this->fd, this->eventmask, this->func, this->uap);
(this->func)(opaqueCtx, this->uap, this->fd, eventmask);
#ifdef EVENTLIB_TIME_CHECKS
@@ -492,7 +492,7 @@ evDispatch(evContext opaqueCtx, evEvent opaqueEv) {
evStream *this = ev->u.stream.this;
evPrintf(ctx, 5,
- "Dispatch.Stream: fd %d, func %#x, uap %#x\n",
+ "Dispatch.Stream: fd %d, func %p, uap %p\n",
this->fd, this->func, this->uap);
errno = this->ioErrno;
(this->func)(opaqueCtx, this->uap, this->fd, this->ioDone);
@@ -504,7 +504,7 @@ evDispatch(evContext opaqueCtx, evEvent opaqueEv) {
case Timer: {
evTimer *this = ev->u.timer.this;
- evPrintf(ctx, 5, "Dispatch.Timer: func %#x, uap %#x\n",
+ evPrintf(ctx, 5, "Dispatch.Timer: func %p, uap %p\n",
this->func, this->uap);
(this->func)(opaqueCtx, this->uap, this->due, this->inter);
#ifdef EVENTLIB_TIME_CHECKS
@@ -516,7 +516,7 @@ evDispatch(evContext opaqueCtx, evEvent opaqueEv) {
evWait *this = ev->u.wait.this;
evPrintf(ctx, 5,
- "Dispatch.Wait: tag %#x, func %#x, uap %#x\n",
+ "Dispatch.Wait: tag %p, func %p, uap %p\n",
this->tag, this->func, this->uap);
(this->func)(opaqueCtx, this->uap, this->tag);
#ifdef EVENTLIB_TIME_CHECKS
diff --git a/contrib/bind/lib/isc/eventlib_p.h b/contrib/bind/lib/isc/eventlib_p.h
index 78f0100..71b95ed 100644
--- a/contrib/bind/lib/isc/eventlib_p.h
+++ b/contrib/bind/lib/isc/eventlib_p.h
@@ -18,7 +18,7 @@
/* eventlib_p.h - private interfaces for eventlib
* vix 09sep95 [initial]
*
- * $Id: eventlib_p.h,v 1.30 2001/11/01 05:35:50 marka Exp $
+ * $Id: eventlib_p.h,v 1.31 2003/04/03 05:37:56 marka Exp $
*/
#ifndef _EVENTLIB_P_H
@@ -198,7 +198,8 @@ typedef struct {
/* eventlib.c */
#define evPrintf __evPrintf
-void evPrintf(const evContext_p *ctx, int level, const char *fmt, ...);
+void evPrintf(const evContext_p *ctx, int level, const char *fmt, ...)
+ ISC_FORMAT_PRINTF(3, 4);
/* ev_timers.c */
#define evCreateTimers __evCreateTimers
diff --git a/contrib/bind/lib/isc/logging.c b/contrib/bind/lib/isc/logging.c
index ca7ea04..f0a4940 100644
--- a/contrib/bind/lib/isc/logging.c
+++ b/contrib/bind/lib/isc/logging.c
@@ -16,7 +16,7 @@
*/
#if !defined(LINT) && !defined(CODECENTER)
-static const char rcsid[] = "$Id: logging.c,v 8.31 2001/06/18 14:44:03 marka Exp $";
+static const char rcsid[] = "$Id: logging.c,v 8.32 2003/01/02 00:35:42 marka Exp $";
#endif /* not lint */
#include "port_before.h"
@@ -282,6 +282,10 @@ log_vwrite(log_context lc, int category, int level, const char *format,
log_channel chan;
struct timeval tv;
struct tm *local_tm;
+#ifdef HAVE_TIME_R
+ struct tm tm_tmp;
+#endif
+ time_t tt;
const char *category_name;
const char *level_str;
char time_buf[256];
@@ -313,10 +317,11 @@ log_vwrite(log_context lc, int category, int level, const char *format,
if (gettimeofday(&tv, NULL) < 0) {
syslog(LOG_INFO, "gettimeofday failed in log_vwrite()");
} else {
+ tt = tv.tv_sec;
#ifdef HAVE_TIME_R
- localtime_r((time_t *)&tv.tv_sec, &local_tm);
+ local_tm = localtime_r(&tt, &tm_tmp);
#else
- local_tm = localtime((time_t *)&tv.tv_sec);
+ local_tm = localtime(&tt);
#endif
if (local_tm != NULL) {
sprintf(time_buf, "%02d-%s-%4d %02d:%02d:%02d.%03ld ",
diff --git a/contrib/bind/lib/nameser/ns_name.c b/contrib/bind/lib/nameser/ns_name.c
index fff96f4..c57ac3b 100644
--- a/contrib/bind/lib/nameser/ns_name.c
+++ b/contrib/bind/lib/nameser/ns_name.c
@@ -16,7 +16,7 @@
*/
#ifndef lint
-static const char rcsid[] = "$Id: ns_name.c,v 8.18.4.1 2002/11/14 13:32:08 marka Exp $";
+static const char rcsid[] = "$Id: ns_name.c,v 8.20 2003/04/03 06:00:07 marka Exp $";
#endif
#include "port_before.h"
@@ -792,7 +792,7 @@ decode_bitstring(const char **cpp, char *dn, const char *eom)
{
const char *cp = *cpp;
char *beg = dn, tc;
- int b, blen, plen;
+ int b, blen, plen, i;
if ((blen = (*cp & 0xff)) == 0)
blen = 256;
@@ -802,18 +802,34 @@ decode_bitstring(const char **cpp, char *dn, const char *eom)
return(-1);
cp++;
- dn += SPRINTF((dn, "\\[x"));
- for (b = blen; b > 7; b -= 8, cp++)
- dn += SPRINTF((dn, "%02x", *cp & 0xff));
+ i = SPRINTF((dn, "\\[x"));
+ if (i < 0)
+ return (-1);
+ dn += i;
+ for (b = blen; b > 7; b -= 8, cp++) {
+ i = SPRINTF((dn, "%02x", *cp & 0xff));
+ if (i < 0)
+ return (-1);
+ dn += i;
+ }
if (b > 4) {
tc = *cp++;
- dn += SPRINTF((dn, "%02x", tc & (0xff << (8 - b))));
+ i = SPRINTF((dn, "%02x", tc & (0xff << (8 - b))));
+ if (i < 0)
+ return (-1);
+ dn += i;
} else if (b > 0) {
tc = *cp++;
- dn += SPRINTF((dn, "%1x",
+ i = SPRINTF((dn, "%1x",
((tc >> 4) & 0x0f) & (0x0f << (4 - b))));
+ if (i < 0)
+ return (-1);
+ dn += i;
}
- dn += SPRINTF((dn, "/%d]", blen));
+ i = SPRINTF((dn, "/%d]", blen));
+ if (i < 0)
+ return (-1);
+ dn += i;
*cpp = cp;
return(dn - beg);
diff --git a/contrib/bind/lib/nameser/ns_parse.c b/contrib/bind/lib/nameser/ns_parse.c
index f3f92c6..abd48f2 100644
--- a/contrib/bind/lib/nameser/ns_parse.c
+++ b/contrib/bind/lib/nameser/ns_parse.c
@@ -16,7 +16,7 @@
*/
#ifndef lint
-static const char rcsid[] = "$Id: ns_parse.c,v 8.17 2001/06/20 02:50:49 marka Exp $";
+static const char rcsid[] = "$Id: ns_parse.c,v 8.18 2003/04/03 06:10:10 marka Exp $";
#endif
/* Import. */
@@ -132,9 +132,10 @@ ns_initparse(const u_char *msg, int msglen, ns_msg *handle) {
int
ns_parserr(ns_msg *handle, ns_sect section, int rrnum, ns_rr *rr) {
int b;
+ int tmp;
/* Make section right. */
- if (section >= ns_s_max)
+ if ((tmp = section) < 0 || section >= ns_s_max)
RETERR(ENODEV);
if (section != handle->_sect)
setsection(handle, section);
diff --git a/contrib/bind/lib/nameser/ns_print.c b/contrib/bind/lib/nameser/ns_print.c
index b23f805..f8a85e7 100644
--- a/contrib/bind/lib/nameser/ns_print.c
+++ b/contrib/bind/lib/nameser/ns_print.c
@@ -16,7 +16,7 @@
*/
#ifndef lint
-static const char rcsid[] = "$Id: ns_print.c,v 8.24 2001/06/18 06:40:45 marka Exp $";
+static const char rcsid[] = "$Id: ns_print.c,v 8.26 2003/02/24 23:56:35 vixie Exp $";
#endif
/* Import. */
@@ -31,6 +31,7 @@ static const char rcsid[] = "$Id: ns_print.c,v 8.24 2001/06/18 06:40:45 marka Ex
#include <arpa/inet.h>
#include <isc/assertions.h>
+#include <isc/dst.h>
#include <errno.h>
#include <resolv.h>
#include <string.h>
@@ -58,10 +59,6 @@ static int addstr(const char *src, size_t len,
static int addtab(size_t len, size_t target, int spaced,
char **buf, size_t *buflen);
-/* Proto. */
-
-u_int16_t dst_s_dns_key_id(const u_char *, const int);
-
/* Macros. */
#define T(x) \
@@ -640,9 +637,10 @@ ns_sprintrrf(const u_char *msg, size_t msglen,
len = SPRINTF((tmp, "%u %u %u ", mode, err, keysize));
T(addstr(tmp, len, &buf, &buflen));
- /* needs to dump key, print otherdata length & other data */
+ /* XXX need to dump key, print otherdata length & other data */
break;
}
+
case ns_t_tsig: {
/* BEW - need to complete this */
int n;
@@ -690,13 +688,13 @@ ns_sprintrrf(const u_char *msg, size_t msglen,
T(addname(msg, msglen, &rdata, origin, &buf, &buflen));
break;
- }
+ }
case ns_t_opt: {
len = SPRINTF((tmp, "%u bytes", class));
T(addstr(tmp, len, &buf, &buflen));
break;
- }
+ }
default:
comment = "unknown RR type";
diff --git a/contrib/bind/lib/nameser/ns_samedomain.c b/contrib/bind/lib/nameser/ns_samedomain.c
index da6f3b6..6394701 100644
--- a/contrib/bind/lib/nameser/ns_samedomain.c
+++ b/contrib/bind/lib/nameser/ns_samedomain.c
@@ -16,7 +16,7 @@
*/
#ifndef lint
-static const char rcsid[] = "$Id: ns_samedomain.c,v 8.9.6.2 2002/11/14 22:36:46 marka Exp $";
+static const char rcsid[] = "$Id: ns_samedomain.c,v 8.10.8.1 2003/06/02 05:05:05 marka Exp $";
#endif
#include "port_before.h"
@@ -125,12 +125,12 @@ ns_samedomain(const char *a, const char *b) {
*/
escaped = 0;
for (i = diff - 2; i >= 0; i--)
- if (a[i] == '\\')
+ if (a[i] == '\\') {
if (escaped)
escaped = 0;
else
escaped = 1;
- else
+ } else
break;
if (escaped)
return (0);
@@ -166,14 +166,14 @@ int
ns_makecanon(const char *src, char *dst, size_t dstsize) {
size_t n = strlen(src);
- if (n + sizeof "." > dstsize) {
+ if (n + sizeof "." > dstsize) { /* Note: sizeof == 2 */
errno = EMSGSIZE;
return (-1);
}
strcpy(dst, src);
- while (n > 0 && dst[n - 1] == '.') /* Ends in "." */
- if (n > 1 && dst[n - 2] == '\\' && /* Ends in "\." */
- (n < 2 || dst[n - 3] != '\\')) /* But not "\\." */
+ while (n >= 1 && dst[n - 1] == '.') /* Ends in "." */
+ if (n >= 2 && dst[n - 2] == '\\' && /* Ends in "\." */
+ (n < 3 || dst[n - 3] != '\\')) /* But not "\\." */
break;
else
dst[--n] = '\0';
diff --git a/contrib/bind/lib/nameser/ns_sign.c b/contrib/bind/lib/nameser/ns_sign.c
index 8c5fe1d..de8cd14 100644
--- a/contrib/bind/lib/nameser/ns_sign.c
+++ b/contrib/bind/lib/nameser/ns_sign.c
@@ -16,7 +16,7 @@
*/
#ifndef lint
-static const char rcsid[] = "$Id: ns_sign.c,v 8.11 2002/04/30 03:43:55 marka Exp $";
+static const char rcsid[] = "$Id: ns_sign.c,v 8.12 2002/10/01 06:48:37 marka Exp $";
#endif
/* Import. */
@@ -41,6 +41,7 @@ static const char rcsid[] = "$Id: ns_sign.c,v 8.11 2002/04/30 03:43:55 marka Exp
#include <unistd.h>
#include <isc/dst.h>
+#include <isc/assertions.h>
#include "port_after.h"
@@ -90,22 +91,30 @@ ns_sign2(u_char *msg, int *msglen, int msgsize, int error, void *k,
DST_KEY *key = (DST_KEY *)k;
u_char *cp = msg + *msglen, *eob = msg + msgsize;
u_char *lenp;
- u_char *name, *alg;
+ u_char *alg;
int n;
time_t timesigned;
+ u_char name[NS_MAXCDNAME];
dst_init();
if (msg == NULL || msglen == NULL || sig == NULL || siglen == NULL)
return (-1);
/* Name. */
- if (key != NULL && error != ns_r_badsig && error != ns_r_badkey)
- n = dn_comp(key->dk_key_name, cp, eob - cp, dnptrs, lastdnptr);
- else
- n = dn_comp("", cp, eob - cp, NULL, NULL);
+ if (key != NULL && error != ns_r_badsig && error != ns_r_badkey) {
+ n = ns_name_pton(key->dk_key_name, name, sizeof name);
+ if (n != -1)
+ n = ns_name_pack(name, cp, eob - cp,
+ (const u_char **)dnptrs,
+ (const u_char **)lastdnptr);
+
+ } else {
+ n = ns_name_pton("", name, sizeof name);
+ if (n != -1)
+ n = ns_name_pack(name, cp, eob - cp, NULL, NULL);
+ }
if (n < 0)
return (NS_TSIG_ERROR_NO_SPACE);
- name = cp;
cp += n;
/* Type, class, ttl, length (not filled in yet). */
@@ -142,7 +151,7 @@ ns_sign2(u_char *msg, int *msglen, int msgsize, int error, void *k,
/* Compute the signature. */
if (key != NULL && error != ns_r_badsig && error != ns_r_badkey) {
void *ctx;
- u_char buf[MAXDNAME], *cp2;
+ u_char buf[NS_MAXCDNAME], *cp2;
int n;
dst_sign_data(SIG_MODE_INIT, key, &ctx, NULL, 0, NULL, 0);
@@ -162,6 +171,7 @@ ns_sign2(u_char *msg, int *msglen, int msgsize, int error, void *k,
/* Digest the key name. */
n = ns_name_ntol(name, buf, sizeof(buf));
+ INSIST(n > 0);
dst_sign_data(SIG_MODE_UPDATE, key, &ctx, buf, n, NULL, 0);
/* Digest the class and TTL. */
@@ -173,6 +183,7 @@ ns_sign2(u_char *msg, int *msglen, int msgsize, int error, void *k,
/* Digest the algorithm. */
n = ns_name_ntol(alg, buf, sizeof(buf));
+ INSIST(n > 0);
dst_sign_data(SIG_MODE_UPDATE, key, &ctx, buf, n, NULL, 0);
/* Digest the time signed, fudge, error, and other data */
diff --git a/contrib/bind/lib/resolv/res_comp.c b/contrib/bind/lib/resolv/res_comp.c
index d972848..15de91a 100644
--- a/contrib/bind/lib/resolv/res_comp.c
+++ b/contrib/bind/lib/resolv/res_comp.c
@@ -70,7 +70,7 @@
#if defined(LIBC_SCCS) && !defined(lint)
static const char sccsid[] = "@(#)res_comp.c 8.1 (Berkeley) 6/4/93";
-static const char rcsid[] = "$Id: res_comp.c,v 8.15 1999/10/13 16:39:39 vixie Exp $";
+static const char rcsid[] = "$Id: res_comp.c,v 8.16 2002/08/07 03:47:34 marka Exp $";
#endif /* LIBC_SCCS and not lint */
#include "port_before.h"
@@ -86,10 +86,10 @@ static const char rcsid[] = "$Id: res_comp.c,v 8.15 1999/10/13 16:39:39 vixie Ex
#include "port_after.h"
/*
- * Expand compressed domain name 'comp_dn' to full domain name.
+ * Expand compressed domain name 'src' to full domain name.
* 'msg' is a pointer to the begining of the message,
- * 'eomorig' points to the first location after the message,
- * 'exp_dn' is a pointer to a buffer of size 'length' for the result.
+ * 'eom' points to the first location after the message,
+ * 'dst' is a pointer to a buffer of size 'dstsiz' for the result.
* Return size of compressed name or -1 if there was an error.
*/
int
diff --git a/contrib/bind/lib/resolv/res_debug.c b/contrib/bind/lib/resolv/res_debug.c
index f2c0689..392796a 100644
--- a/contrib/bind/lib/resolv/res_debug.c
+++ b/contrib/bind/lib/resolv/res_debug.c
@@ -95,7 +95,7 @@
#if defined(LIBC_SCCS) && !defined(lint)
static const char sccsid[] = "@(#)res_debug.c 8.1 (Berkeley) 6/4/93";
-static const char rcsid[] = "$Id: res_debug.c,v 8.46 2002/05/21 01:57:45 marka Exp $";
+static const char rcsid[] = "$Id: res_debug.c,v 8.49.6.1 2003/06/04 01:09:43 marka Exp $";
#endif /* LIBC_SCCS and not lint */
#include "port_before.h"
@@ -615,9 +615,6 @@ p_option(u_long option) {
#ifdef RES_USE_EDNS0 /* KAME extension */
case RES_USE_EDNS0: return "edns0";
#endif
-#ifdef RES_USE_A6
- case RES_USE_A6: return "a6";
-#endif
#ifdef RES_USE_DNAME
case RES_USE_DNAME: return "dname";
#endif
@@ -655,6 +652,33 @@ p_rcode(int rcode) {
}
/*
+ * Return a string for a res_sockaddr_union.
+ */
+const char *
+p_sockun(union res_sockaddr_union u, char *buf, size_t size) {
+ char ret[sizeof "ffff:ffff:ffff:ffff:ffff:ffff:123.123.123.123"];
+
+ switch (u.sin.sin_family) {
+ case AF_INET:
+ inet_ntop(AF_INET, &u.sin.sin_addr, ret, sizeof ret);
+ break;
+#ifdef HAS_INET6_STRUCTS
+ case AF_INET6:
+ inet_ntop(AF_INET6, &u.sin6.sin6_addr, ret, sizeof ret);
+ break;
+#endif
+ default:
+ sprintf(ret, "[af%d]", u.sin.sin_family);
+ break;
+ }
+ if (size > 0) {
+ strncpy(buf, ret, size - 1);
+ buf[size - 1] = '0';
+ }
+ return (buf);
+}
+
+/*
* routines to convert between on-the-wire RR format and zone file format.
* Does not contain conversion to/from decimal degrees; divide or multiply
* by 60*60*1000 for that.
@@ -1101,8 +1125,9 @@ res_nametoclass(const char *buf, int *successp) {
if (strncasecmp(buf, "CLASS", 5) != 0 ||
!isdigit((unsigned char)buf[5]))
goto done;
+ errno = 0;
result = strtoul(buf + 5, &endptr, 10);
- if (*endptr == '\0' && result <= 0xffff)
+ if (errno == 0 && *endptr == '\0' && result <= 0xffff)
success = 1;
done:
if (successp)
@@ -1123,8 +1148,9 @@ res_nametotype(const char *buf, int *successp) {
if (strncasecmp(buf, "type", 4) != 0 ||
!isdigit((unsigned char)buf[4]))
goto done;
+ errno = 0;
result = strtoul(buf + 4, &endptr, 10);
- if (*endptr == '\0' && result <= 0xffff)
+ if (errno == 0 && *endptr == '\0' && result <= 0xffff)
success = 1;
done:
if (successp)
diff --git a/contrib/bind/lib/resolv/res_findzonecut.c b/contrib/bind/lib/resolv/res_findzonecut.c
index a82c3f1..018ec4d 100644
--- a/contrib/bind/lib/resolv/res_findzonecut.c
+++ b/contrib/bind/lib/resolv/res_findzonecut.c
@@ -1,5 +1,5 @@
#if !defined(lint) && !defined(SABER)
-static const char rcsid[] = "$Id: res_findzonecut.c,v 8.16 2002/04/12 06:27:46 marka Exp $";
+static const char rcsid[] = "$Id: res_findzonecut.c,v 8.17.6.2 2003/06/02 09:24:40 marka Exp $";
#endif /* not lint */
/*
@@ -49,19 +49,21 @@ static const char rcsid[] = "$Id: res_findzonecut.c,v 8.16 2002/04/12 06:27:46 m
typedef struct rr_a {
LINK(struct rr_a) link;
- union res_sockaddr_union addr;
+ union res_sockaddr_union addr;
} rr_a;
typedef LIST(rr_a) rrset_a;
typedef struct rr_ns {
LINK(struct rr_ns) link;
const char * name;
- int have_v4;
- int have_v6;
+ unsigned int flags;
rrset_a addrs;
} rr_ns;
typedef LIST(rr_ns) rrset_ns;
+#define RR_NS_HAVE_V4 0x01
+#define RR_NS_HAVE_V6 0x02
+
/* Forward. */
static int satisfy(res_state, const char *, rrset_ns *,
@@ -149,7 +151,8 @@ static void res_dprintf(const char *, ...) ISC_FORMAT_PRINTF(1, 2);
int
res_findzonecut(res_state statp, const char *dname, ns_class class, int opts,
- char *zname, size_t zsize, struct in_addr *addrs, int naddrs) {
+ char *zname, size_t zsize, struct in_addr *addrs, int naddrs)
+{
int result, i;
union res_sockaddr_union *u;
@@ -267,7 +270,7 @@ get_soa(res_state statp, const char *dname, ns_class class, int opts,
rrset_ns *nsrrsp)
{
char tname[NS_MAXDNAME];
- u_char resp[NS_PACKETSZ];
+ u_char *resp = NULL;
int n, i, ancount, nscount;
ns_sect sect;
ns_msg msg;
@@ -279,9 +282,13 @@ get_soa(res_state statp, const char *dname, ns_class class, int opts,
/* First canonicalize dname (exactly one unescaped trailing "."). */
if (ns_makecanon(dname, tname, sizeof tname) < 0)
- return (-1);
+ goto cleanup;
dname = tname;
+ resp = malloc(NS_MAXMSG);
+ if (resp == NULL)
+ goto cleanup;
+
/* Now grovel the subdomains, hunting for an SOA answer or auth. */
for (;;) {
/* Leading or inter-label '.' are skipped here. */
@@ -293,7 +300,7 @@ get_soa(res_state statp, const char *dname, ns_class class, int opts,
if (n < 0) {
DPRINTF(("get_soa: do_query('%s', %s) failed (%d)",
dname, p_class(class), n));
- return (-1);
+ goto cleanup;
}
if (n > 0) {
DPRINTF(("get_soa: CNAME or DNAME found"));
@@ -318,7 +325,7 @@ get_soa(res_state statp, const char *dname, ns_class class, int opts,
if (ns_parserr(&msg, sect, i, &rr) < 0) {
DPRINTF(("get_soa: ns_parserr(%s, %d) failed",
p_section(sect, ns_o_query), i));
- return (-1);
+ goto cleanup;
}
if (ns_rr_type(rr) == ns_t_cname ||
ns_rr_type(rr) == ns_t_dname)
@@ -330,19 +337,23 @@ get_soa(res_state statp, const char *dname, ns_class class, int opts,
switch (sect) {
case ns_s_an:
if (ns_samedomain(dname, t) == 0) {
- DPRINTF(("get_soa: ns_samedomain('%s', '%s') == 0",
- dname, t));
+ DPRINTF(
+ ("get_soa: ns_samedomain('%s', '%s') == 0",
+ dname, t)
+ );
errno = EPROTOTYPE;
- return (-1);
+ goto cleanup;
}
break;
case ns_s_ns:
if (ns_samename(dname, t) == 1 ||
ns_samedomain(dname, t) == 0) {
- DPRINTF(("get_soa: ns_samename() || !ns_samedomain('%s', '%s')",
- dname, t));
+ DPRINTF(
+ ("get_soa: ns_samename() || !ns_samedomain('%s', '%s')",
+ dname, t)
+ );
errno = EPROTOTYPE;
- return (-1);
+ goto cleanup;
}
break;
default:
@@ -352,21 +363,23 @@ get_soa(res_state statp, const char *dname, ns_class class, int opts,
DPRINTF(("get_soa: zname(%d) too small (%d)",
zsize, strlen(t) + 1));
errno = EMSGSIZE;
- return (-1);
+ goto cleanup;
}
strcpy(zname, t);
rdata = ns_rr_rdata(rr);
rdlen = ns_rr_rdlen(rr);
if (ns_name_uncompress(resp, ns_msg_end(msg), rdata,
mname, msize) < 0) {
- DPRINTF(("get_soa: ns_name_uncompress failed"));
- return (-1);
+ DPRINTF(("get_soa: ns_name_uncompress failed")
+ );
+ goto cleanup;
}
if (save_ns(statp, &msg, ns_s_ns,
zname, class, opts, nsrrsp) < 0) {
DPRINTF(("get_soa: save_ns failed"));
- return (-1);
+ goto cleanup;
}
+ free(resp);
return (0);
}
@@ -379,13 +392,16 @@ get_soa(res_state statp, const char *dname, ns_class class, int opts,
if (*dname == '\\')
if (*++dname == '\0') {
errno = EMSGSIZE;
- return (-1);
+ goto cleanup;
}
dname++;
}
}
DPRINTF(("get_soa: out of labels"));
errno = EDESTADDRREQ;
+ cleanup:
+ if (resp != NULL)
+ free(resp);
return (-1);
}
@@ -393,15 +409,20 @@ static int
get_ns(res_state statp, const char *zname, ns_class class, int opts,
rrset_ns *nsrrsp)
{
- u_char resp[NS_PACKETSZ];
+ u_char *resp;
ns_msg msg;
int n;
+ resp = malloc(NS_MAXMSG);
+ if (resp == NULL)
+ return (-1);
+
/* Go and get the NS RRs for this zone. */
n = do_query(statp, zname, class, ns_t_ns, resp, &msg);
if (n != 0) {
DPRINTF(("get_ns: do_query('%s', %s) failed (%d)",
zname, p_class(class), n));
+ free(resp);
return (-1);
}
@@ -409,31 +430,38 @@ get_ns(res_state statp, const char *zname, ns_class class, int opts,
if (save_ns(statp, &msg, ns_s_an, zname, class, opts, nsrrsp) < 0) {
DPRINTF(("get_ns save_ns('%s', %s) failed",
zname, p_class(class)));
+ free(resp);
return (-1);
}
+ free(resp);
return (0);
}
static int
get_glue(res_state statp, ns_class class, int opts, rrset_ns *nsrrsp) {
rr_ns *nsrr, *nsrr_n;
+ u_char *resp;
+
+ resp = malloc(NS_MAXMSG);
+ if (resp == NULL)
+ return(-1);
/* Go and get the A RRs for each empty NS RR on our list. */
for (nsrr = HEAD(*nsrrsp); nsrr != NULL; nsrr = nsrr_n) {
- u_char resp[NS_PACKETSZ];
ns_msg msg;
int n;
nsrr_n = NEXT(nsrr, link);
- if (!nsrr->have_v4) {
+ if ((nsrr->flags & RR_NS_HAVE_V4) == 0) {
n = do_query(statp, nsrr->name, class, ns_t_a,
resp, &msg);
if (n < 0) {
- DPRINTF(("get_glue: do_query('%s', %s') failed",
- nsrr->name, p_class(class)));
- return (-1);
+ DPRINTF(
+ ("get_glue: do_query('%s', %s') failed",
+ nsrr->name, p_class(class)));
+ goto cleanup;
}
if (n > 0) {
DPRINTF((
@@ -444,17 +472,18 @@ get_glue(res_state statp, ns_class class, int opts, rrset_ns *nsrrsp) {
opts, nsrr) < 0) {
DPRINTF(("get_glue: save_r('%s', %s) failed",
nsrr->name, p_class(class)));
- return (-1);
+ goto cleanup;
}
}
- if (!nsrr->have_v6) {
+ if ((nsrr->flags & RR_NS_HAVE_V6) == 0) {
n = do_query(statp, nsrr->name, class, ns_t_aaaa,
resp, &msg);
if (n < 0) {
- DPRINTF(("get_glue: do_query('%s', %s') failed",
- nsrr->name, p_class(class)));
- return (-1);
+ DPRINTF(
+ ("get_glue: do_query('%s', %s') failed",
+ nsrr->name, p_class(class)));
+ goto cleanup;
}
if (n > 0) {
DPRINTF((
@@ -465,7 +494,7 @@ get_glue(res_state statp, ns_class class, int opts, rrset_ns *nsrrsp) {
opts, nsrr) < 0) {
DPRINTF(("get_glue: save_r('%s', %s) failed",
nsrr->name, p_class(class)));
- return (-1);
+ goto cleanup;
}
}
@@ -476,7 +505,12 @@ get_glue(res_state statp, ns_class class, int opts, rrset_ns *nsrrsp) {
free_nsrr(nsrrsp, nsrr);
}
}
+ free(resp);
return (0);
+
+ cleanup:
+ free(resp);
+ return (-1);
}
static int
@@ -514,7 +548,8 @@ save_ns(res_state statp, ns_msg *msg, ns_sect sect,
if (ns_name_uncompress(ns_msg_base(*msg),
ns_msg_end(*msg), rdata,
tname, sizeof tname) < 0) {
- DPRINTF(("save_ns: ns_name_uncompress failed"));
+ DPRINTF(("save_ns: ns_name_uncompress failed")
+ );
free(nsrr);
return (-1);
}
@@ -526,8 +561,7 @@ save_ns(res_state statp, ns_msg *msg, ns_sect sect,
}
INIT_LINK(nsrr, link);
INIT_LIST(nsrr->addrs);
- nsrr->have_v4 = 0;
- nsrr->have_v6 = 0;
+ nsrr->flags = 0;
APPEND(*nsrrsp, nsrr, link);
}
if (save_a(statp, msg, ns_s_ar,
@@ -556,7 +590,8 @@ save_a(res_state statp, ns_msg *msg, ns_sect sect,
p_section(sect, ns_o_query), i));
return (-1);
}
- if ((ns_rr_type(rr) != ns_t_a && ns_rr_type(rr) != ns_t_aaaa) ||
+ if ((ns_rr_type(rr) != ns_t_a &&
+ ns_rr_type(rr) != ns_t_aaaa) ||
ns_rr_class(rr) != class ||
ns_samename(ns_rr_name(rr), owner) != 1 ||
ns_rr_rdlen(rr) != NS_INADDRSZ)
@@ -581,7 +616,7 @@ save_a(res_state statp, ns_msg *msg, ns_sect sect,
memcpy(&arr->addr.sin.sin_addr, ns_rr_rdata(rr),
NS_INADDRSZ);
arr->addr.sin.sin_port = htons(NAMESERVER_PORT);
- nsrr->have_v4 = 1;
+ nsrr->flags |= RR_NS_HAVE_V4;
break;
case ns_t_aaaa:
arr->addr.sin6.sin6_family = AF_INET6;
@@ -590,7 +625,7 @@ save_a(res_state statp, ns_msg *msg, ns_sect sect,
#endif
memcpy(&arr->addr.sin6.sin6_addr, ns_rr_rdata(rr), 16);
arr->addr.sin.sin_port = htons(NAMESERVER_PORT);
- nsrr->have_v6 = 1;
+ nsrr->flags |= RR_NS_HAVE_V6;
break;
default:
abort();
@@ -646,7 +681,7 @@ do_query(res_state statp, const char *dname, ns_class class, ns_type qtype,
DPRINTF(("do_query: res_nmkquery failed"));
return (-1);
}
- n = res_nsend(statp, req, n, resp, NS_PACKETSZ);
+ n = res_nsend(statp, req, n, resp, NS_MAXMSG);
if (n < 0) {
DPRINTF(("do_query: res_nsend failed"));
return (-1);
diff --git a/contrib/bind/lib/resolv/res_init.c b/contrib/bind/lib/resolv/res_init.c
index 9f99d14..7e507be 100644
--- a/contrib/bind/lib/resolv/res_init.c
+++ b/contrib/bind/lib/resolv/res_init.c
@@ -70,7 +70,7 @@
#if defined(LIBC_SCCS) && !defined(lint)
static const char sccsid[] = "@(#)res_init.c 8.1 (Berkeley) 6/7/93";
-static const char rcsid[] = "$Id: res_init.c,v 8.29 2002/05/31 06:05:31 marka Exp $";
+static const char rcsid[] = "$Id: res_init.c,v 8.32 2003/04/03 06:31:10 marka Exp $";
#endif /* LIBC_SCCS and not lint */
#include "port_before.h"
@@ -161,6 +161,7 @@ __res_vinit(res_state statp, int preinit) {
char *net;
#endif
int dots;
+ union res_sockaddr_union u[2];
if (!preinit) {
statp->retrans = RES_TIMEOUT;
@@ -172,17 +173,32 @@ __res_vinit(res_state statp, int preinit) {
if ((statp->options & RES_INIT) != 0)
res_ndestroy(statp);
+ memset(u, 0, sizeof(u));
#ifdef USELOOPBACK
- statp->nsaddr.sin_addr = inet_makeaddr(IN_LOOPBACKNET, 1);
+ u[nserv].sin.sin_addr = inet_makeaddr(IN_LOOPBACKNET, 1);
#else
- statp->nsaddr.sin_addr.s_addr = INADDR_ANY;
+ u[nserv].sin.sin_addr.s_addr = INADDR_ANY;
#endif
- statp->nsaddr.sin_family = AF_INET;
- statp->nsaddr.sin_port = htons(NAMESERVER_PORT);
+ u[nserv].sin.sin_family = AF_INET;
+ u[nserv].sin.sin_port = htons(NAMESERVER_PORT);
#ifdef HAVE_SA_LEN
- statp->nsaddr.sin_len = sizeof(struct sockaddr_in);
+ u[nserv].sin.sin_len = sizeof(struct sockaddr_in);
#endif
- statp->nscount = 1;
+ nserv++;
+#ifdef HAS_INET6_STRUCTS
+#ifdef USELOOPBACK
+ u[nserv].sin6.sin6_addr = in6addr_loopback;
+#else
+ u[nserv].sin6.sin6_addr = in6addr_any;
+#endif
+ u[nserv].sin6.sin6_family = AF_INET6;
+ u[nserv].sin6.sin6_port = htons(NAMESERVER_PORT);
+#ifdef HAVE_SA_LEN
+ u[nserv].sin6.sin6_len = sizeof(struct sockaddr_in6);
+#endif
+ nserv++;
+#endif
+ statp->nscount = 0;
statp->ndots = 1;
statp->pfcode = 0;
statp->_vcsock = -1;
@@ -196,11 +212,11 @@ __res_vinit(res_state statp, int preinit) {
statp->_u._ext.ext->nsaddrs[0].sin = statp->nsaddr;
strcpy(statp->_u._ext.ext->nsuffix, "ip6.arpa");
strcpy(statp->_u._ext.ext->nsuffix2, "ip6.int");
- strcpy(statp->_u._ext.ext->bsuffix, "ip6.arpa");
}
#ifdef RESOLVSORT
statp->nsort = 0;
#endif
+ res_setservers(statp, u, nserv);
/* Allow user to override the local domain definition */
if ((cp = getenv("LOCALDOMAIN")) != NULL) {
@@ -242,6 +258,7 @@ __res_vinit(res_state statp, int preinit) {
(line[sizeof(name) - 1] == ' ' || \
line[sizeof(name) - 1] == '\t'))
+ nserv = 0;
if ((fp = fopen(_PATH_RESCONF, "r")) != NULL) {
/* read the config file */
while (fgets(buf, sizeof(buf), fp) != NULL) {
@@ -507,9 +524,6 @@ res_setoptions(res_state statp, const char *options, const char *source)
statp->options |= RES_USE_EDNS0;
}
#endif
- else if (!strncmp(cp, "a6", sizeof("a6") - 1)) {
- statp->options |= RES_USE_A6;
- }
else if (!strncmp(cp, "dname", sizeof("dname") - 1)) {
statp->options |= RES_USE_DNAME;
}
@@ -529,14 +543,6 @@ res_setoptions(res_state statp, const char *options, const char *source)
strncpy(ext->nsuffix2, cp, i);
ext->nsuffix2[i] = '\0';
}
- else if (!strncmp(cp, "bitstring:", sizeof("bitstring:") - 1)) {
- if (ext == NULL)
- goto skip;
- cp += sizeof("bitstring:") - 1;
- i = MIN(strcspn(cp, " \t"), sizeof(ext->bsuffix) - 1);
- strncpy(ext->bsuffix, cp, i);
- ext->bsuffix[i] = '\0';
- }
else if (!strncmp(cp, "v6revmode:", sizeof("v6revmode:") - 1)) {
cp += sizeof("v6revmode:") - 1;
/* "nibble" and "bitstring" used to be valid */
@@ -628,13 +634,6 @@ res_get_nibblesuffix2(res_state statp) {
return ("ip6.int");
}
-const char *
-res_get_bitstringsuffix(res_state statp) {
- if (statp->_u._ext.ext)
- return (statp->_u._ext.ext->bsuffix);
- return ("ip6.arpa");
-}
-
void
res_setservers(res_state statp, const union res_sockaddr_union *set, int cnt) {
int i, nserv;
diff --git a/contrib/bind/lib/resolv/res_mkquery.c b/contrib/bind/lib/resolv/res_mkquery.c
index 7041227..a45d89b 100644
--- a/contrib/bind/lib/resolv/res_mkquery.c
+++ b/contrib/bind/lib/resolv/res_mkquery.c
@@ -70,7 +70,7 @@
#if defined(LIBC_SCCS) && !defined(lint)
static const char sccsid[] = "@(#)res_mkquery.c 8.1 (Berkeley) 6/4/93";
-static const char rcsid[] = "$Id: res_mkquery.c,v 8.14 2001/09/24 13:50:27 marka Exp $";
+static const char rcsid[] = "$Id: res_mkquery.c,v 8.15.8.1 2003/06/02 05:59:57 marka Exp $";
#endif /* LIBC_SCCS and not lint */
#include "port_before.h"
@@ -105,7 +105,7 @@ res_nmkquery(res_state statp,
int buflen) /* size of buffer */
{
register HEADER *hp;
- register u_char *cp;
+ register u_char *cp, *ep;
register int n;
u_char *dnptrs[20], **dpp, **lastdnptr;
@@ -128,7 +128,7 @@ res_nmkquery(res_state statp,
hp->rd = (statp->options & RES_RECURSE) != 0;
hp->rcode = NOERROR;
cp = buf + HFIXEDSZ;
- buflen -= HFIXEDSZ;
+ ep = buf + buflen;
dpp = dnptrs;
*dpp++ = buf;
*dpp++ = NULL;
@@ -139,15 +139,15 @@ res_nmkquery(res_state statp,
switch (op) {
case QUERY: /*FALLTHROUGH*/
case NS_NOTIFY_OP:
- if ((buflen -= QFIXEDSZ) < 0)
+ if (ep - cp < QFIXEDSZ)
return (-1);
- if ((n = dn_comp(dname, cp, buflen, dnptrs, lastdnptr)) < 0)
+ if ((n = dn_comp(dname, cp, ep - cp - QFIXEDSZ, dnptrs,
+ lastdnptr)) < 0)
return (-1);
cp += n;
- buflen -= n;
- __putshort(type, cp);
+ ns_put16(type, cp);
cp += INT16SZ;
- __putshort(class, cp);
+ ns_put16(class, cp);
cp += INT16SZ;
hp->qdcount = htons(1);
if (op == QUERY || data == NULL)
@@ -155,19 +155,20 @@ res_nmkquery(res_state statp,
/*
* Make an additional record for completion domain.
*/
- buflen -= RRFIXEDSZ;
- n = dn_comp((const char *)data, cp, buflen, dnptrs, lastdnptr);
+ if ((ep - cp) < RRFIXEDSZ)
+ return (-1);
+ n = dn_comp((const char *)data, cp, ep - cp - RRFIXEDSZ,
+ dnptrs, lastdnptr);
if (n < 0)
return (-1);
cp += n;
- buflen -= n;
- __putshort(T_NULL, cp);
+ ns_put16(T_NULL, cp);
cp += INT16SZ;
- __putshort(class, cp);
+ ns_put16(class, cp);
cp += INT16SZ;
- __putlong(0, cp);
+ ns_put32(0, cp);
cp += INT32SZ;
- __putshort(0, cp);
+ ns_put16(0, cp);
cp += INT16SZ;
hp->arcount = htons(1);
break;
@@ -176,16 +177,16 @@ res_nmkquery(res_state statp,
/*
* Initialize answer section
*/
- if (buflen < 1 + RRFIXEDSZ + datalen)
+ if (ep - cp < 1 + RRFIXEDSZ + datalen)
return (-1);
*cp++ = '\0'; /* no domain name */
- __putshort(type, cp);
+ ns_put16(type, cp);
cp += INT16SZ;
- __putshort(class, cp);
+ ns_put16(class, cp);
cp += INT16SZ;
- __putlong(0, cp);
+ ns_put32(0, cp);
cp += INT32SZ;
- __putshort(datalen, cp);
+ ns_put16(datalen, cp);
cp += INT16SZ;
if (datalen) {
memcpy(cp, data, datalen);
@@ -207,15 +208,14 @@ res_nmkquery(res_state statp,
#endif
int
-res_nopt(statp, n0, buf, buflen, anslen)
- res_state statp;
- int n0;
- u_char *buf; /* buffer to put query */
- int buflen; /* size of buffer */
- int anslen; /* answer buffer length */
+res_nopt(res_state statp,
+ int n0, /* current offset in buffer */
+ u_char *buf, /* buffer to put query */
+ int buflen, /* size of buffer */
+ int anslen) /* UDP answer buffer size */
{
register HEADER *hp;
- register u_char *cp;
+ register u_char *cp, *ep;
u_int16_t flags = 0;
#ifdef DEBUG
@@ -225,17 +225,16 @@ res_nopt(statp, n0, buf, buflen, anslen)
hp = (HEADER *) buf;
cp = buf + n0;
- buflen -= n0;
+ ep = buf + buflen;
- if (buflen < 1 + RRFIXEDSZ)
- return -1;
+ if ((ep - cp) < 1 + RRFIXEDSZ)
+ return (-1);
*cp++ = 0; /* "." */
- buflen--;
- __putshort(T_OPT, cp); /* TYPE */
+ ns_put16(T_OPT, cp); /* TYPE */
cp += INT16SZ;
- __putshort(anslen & 0xffff, cp); /* CLASS = UDP payload size */
+ ns_put16(anslen & 0xffff, cp); /* CLASS = UDP payload size */
cp += INT16SZ;
*cp++ = NOERROR; /* extended RCODE */
*cp++ = 0; /* EDNS version */
@@ -246,13 +245,12 @@ res_nopt(statp, n0, buf, buflen, anslen)
#endif
flags |= NS_OPT_DNSSEC_OK;
}
- __putshort(flags, cp);
+ ns_put16(flags, cp);
cp += INT16SZ;
- __putshort(0, cp); /* RDLEN */
+ ns_put16(0, cp); /* RDLEN */
cp += INT16SZ;
hp->arcount = htons(ntohs(hp->arcount) + 1);
- buflen -= RRFIXEDSZ;
- return cp - buf;
+ return (cp - buf);
}
#endif
diff --git a/contrib/bind/lib/resolv/res_mkupdate.c b/contrib/bind/lib/resolv/res_mkupdate.c
index 6071360..3928f9f 100644
--- a/contrib/bind/lib/resolv/res_mkupdate.c
+++ b/contrib/bind/lib/resolv/res_mkupdate.c
@@ -21,7 +21,7 @@
*/
#if !defined(lint) && !defined(SABER)
-static const char rcsid[] = "$Id: res_mkupdate.c,v 1.26 2001/05/29 05:49:47 marka Exp $";
+static const char rcsid[] = "$Id: res_mkupdate.c,v 1.27.8.1 2003/06/02 04:56:28 marka Exp $";
#endif /* not lint */
#include "port_before.h"
@@ -302,7 +302,7 @@ res_nmkupdate(res_state statp, ns_updrec *rrecp_in, u_char *buf, int buflen) {
if (!getword_str(buf2, sizeof buf2, &startp, endp))
return (-1);
- n = dn_comp(buf2, cp, buflen, dnptrs, lastdnptr);
+ n = dn_comp(buf2, cp, buflen, NULL, NULL);
if (n < 0)
return (-1);
cp += n;
@@ -482,8 +482,10 @@ res_nmkupdate(res_state statp, ns_updrec *rrecp_in, u_char *buf, int buflen) {
char *ulendp;
u_int32_t ottl;
+ errno = 0;
ottl = strtoul(buf2, &ulendp, 10);
- if (ulendp != NULL && *ulendp != '\0')
+ if (errno != 0 ||
+ (ulendp != NULL && *ulendp != '\0'))
return (-1);
ShrinkBuffer(INT32SZ);
PUTLONG(ottl, cp);
@@ -572,7 +574,7 @@ res_nmkupdate(res_state statp, ns_updrec *rrecp_in, u_char *buf, int buflen) {
/* next name */
if (!getword_str(buf2, sizeof buf2, &startp, endp))
return (-1);
- n = dn_comp(buf2, cp, buflen, dnptrs, lastdnptr);
+ n = dn_comp(buf2, cp, buflen, NULL, NULL);
if (n < 0)
return (-1);
cp += n;
@@ -636,6 +638,62 @@ res_nmkupdate(res_state statp, ns_updrec *rrecp_in, u_char *buf, int buflen) {
memcpy(cp, &in6a, NS_IN6ADDRSZ);
cp += NS_IN6ADDRSZ;
break;
+ case ns_t_naptr:
+ /* Order Preference Flags Service Replacement Regexp */
+ /* Order */
+ n = getnum_str(&startp, endp);
+ if (n < 0 || n > 65535)
+ return (-1);
+ ShrinkBuffer(INT16SZ);
+ PUTSHORT(n, cp);
+ /* Preference */
+ n = getnum_str(&startp, endp);
+ if (n < 0 || n > 65535)
+ return (-1);
+ ShrinkBuffer(INT16SZ);
+ PUTSHORT(n, cp);
+ /* Flags */
+ if ((n = getstr_str(buf2, sizeof buf2,
+ &startp, endp)) < 0) {
+ return (-1);
+ }
+ if (n > 255)
+ return (-1);
+ ShrinkBuffer(n+1);
+ *cp++ = n;
+ memcpy(cp, buf2, n);
+ cp += n;
+ /* Service Classes */
+ if ((n = getstr_str(buf2, sizeof buf2,
+ &startp, endp)) < 0) {
+ return (-1);
+ }
+ if (n > 255)
+ return (-1);
+ ShrinkBuffer(n+1);
+ *cp++ = n;
+ memcpy(cp, buf2, n);
+ cp += n;
+ /* Pattern */
+ if ((n = getstr_str(buf2, sizeof buf2,
+ &startp, endp)) < 0) {
+ return (-1);
+ }
+ if (n > 255)
+ return (-1);
+ ShrinkBuffer(n+1);
+ *cp++ = n;
+ memcpy(cp, buf2, n);
+ cp += n;
+ /* Replacement */
+ if (!getword_str(buf2, sizeof buf2, &startp, endp))
+ return (-1);
+ n = dn_comp(buf2, cp, buflen, NULL, NULL);
+ if (n < 0)
+ return (-1);
+ cp += n;
+ ShrinkBuffer(n);
+ break;
default:
return (-1);
} /*switch*/
@@ -807,7 +865,7 @@ gethexnum_str(u_char **startpp, u_char *endp) {
}
/*
- * Get a whitespace delimited base 16 number from a string (not file) into buf
+ * Get a whitespace delimited base 10 number from a string (not file) into buf
* update the start pointer to point after the number in the string.
*/
static int
diff --git a/contrib/bind/lib/resolv/res_private.h b/contrib/bind/lib/resolv/res_private.h
index ec9b384..d7b66cd 100644
--- a/contrib/bind/lib/resolv/res_private.h
+++ b/contrib/bind/lib/resolv/res_private.h
@@ -11,7 +11,6 @@ struct __res_state_ext {
} addr, mask;
} sort_list[MAXRESOLVSORT];
char nsuffix[64];
- char bsuffix[64];
char nsuffix2[64];
};
diff --git a/contrib/bind/lib/resolv/res_query.c b/contrib/bind/lib/resolv/res_query.c
index 61f5df9..cda076c 100644
--- a/contrib/bind/lib/resolv/res_query.c
+++ b/contrib/bind/lib/resolv/res_query.c
@@ -70,7 +70,7 @@
#if defined(LIBC_SCCS) && !defined(lint)
static const char sccsid[] = "@(#)res_query.c 8.1 (Berkeley) 6/4/93";
-static const char rcsid[] = "$Id: res_query.c,v 8.23 2001/09/24 13:50:29 marka Exp $";
+static const char rcsid[] = "$Id: res_query.c,v 8.24 2003/01/31 15:25:58 vixie Exp $";
#endif /* LIBC_SCCS and not lint */
#include "port_before.h"
@@ -167,8 +167,11 @@ again:
if (hp->rcode != NOERROR || ntohs(hp->ancount) == 0) {
#ifdef DEBUG
if (statp->options & RES_DEBUG)
- printf(";; rcode = %d, ancount=%d\n", hp->rcode,
- ntohs(hp->ancount));
+ printf(";; rcode = (%s), counts = an:%d ns:%d ar:%d\n",
+ p_rcode(hp->rcode),
+ ntohs(hp->ancount),
+ ntohs(hp->nscount),
+ ntohs(hp->arcount));
#endif
switch (hp->rcode) {
case NXDOMAIN:
diff --git a/contrib/bind/lib/resolv/res_send.c b/contrib/bind/lib/resolv/res_send.c
index 6f0e430..2adc608 100644
--- a/contrib/bind/lib/resolv/res_send.c
+++ b/contrib/bind/lib/resolv/res_send.c
@@ -70,7 +70,7 @@
#if defined(LIBC_SCCS) && !defined(lint)
static const char sccsid[] = "@(#)res_send.c 8.1 (Berkeley) 6/4/93";
-static const char rcsid[] = "$Id: res_send.c,v 8.49 2002/03/29 21:50:51 marka Exp $";
+static const char rcsid[] = "$Id: res_send.c,v 8.51.2.1 2003/06/02 05:59:57 marka Exp $";
#endif /* LIBC_SCCS and not lint */
/*
@@ -171,6 +171,9 @@ res_ourserver_p(const res_state statp, const struct sockaddr *sa) {
srv6 = (struct sockaddr_in6 *)get_nsaddr(statp, ns);
if (srv6->sin6_family == in6p->sin6_family &&
srv6->sin6_port == in6p->sin6_port &&
+#ifdef HAVE_SIN6_SCOPE_ID
+ srv6->sin6_scope_id == in6p->sin6_scope_id &&
+#endif
(IN6_IS_ADDR_UNSPECIFIED(&srv6->sin6_addr) ||
IN6_ARE_ADDR_EQUAL(&srv6->sin6_addr, &in6p->sin6_addr)))
return (1);
@@ -386,6 +389,8 @@ res_nsend(res_state statp,
int nsaplen;
nsap = get_nsaddr(statp, ns);
nsaplen = get_salen(nsap);
+ statp->_flags &= ~RES_F_LASTMASK;
+ statp->_flags |= (ns << RES_F_LASTSHIFT);
same_ns:
if (statp->qhook) {
int done = 0, loops = 0;
@@ -623,7 +628,7 @@ send_vc(res_state statp,
/*
* Send length & message
*/
- putshort((u_short)buflen, (u_char*)&len);
+ ns_put16((u_short)buflen, (u_char*)&len);
iov[0] = evConsIovec(&len, INT16SZ);
DE_CONST(buf, tmp);
iov[1] = evConsIovec(tmp, buflen);
diff --git a/contrib/bind/lib/resolv/res_update.c b/contrib/bind/lib/resolv/res_update.c
index 12ee326..35c9b07 100644
--- a/contrib/bind/lib/resolv/res_update.c
+++ b/contrib/bind/lib/resolv/res_update.c
@@ -1,5 +1,5 @@
#if !defined(lint) && !defined(SABER)
-static const char rcsid[] = "$Id: res_update.c,v 1.34 2002/04/12 06:28:52 marka Exp $";
+static const char rcsid[] = "$Id: res_update.c,v 1.35.8.2 2003/06/02 09:24:40 marka Exp $";
#endif /* not lint */
/*
@@ -77,7 +77,7 @@ struct zonegrp {
/* Forward. */
-static void res_dprintf(const char *, ...);
+static void res_dprintf(const char *, ...) ISC_FORMAT_PRINTF(1, 2);
/* Macros. */
@@ -92,12 +92,18 @@ static void res_dprintf(const char *, ...);
int
res_nupdate(res_state statp, ns_updrec *rrecp_in, ns_tsig_key *key) {
ns_updrec *rrecp;
- u_char answer[PACKETSZ], packet[2*PACKETSZ];
+ u_char answer[PACKETSZ];
+ u_char *packet;
struct zonegrp *zptr, tgrp;
LIST(struct zonegrp) zgrps;
int nzones = 0, nscount = 0, n;
union res_sockaddr_union nsaddrs[MAXNS];
+ packet = malloc(NS_MAXMSG);
+ if (packet == NULL) {
+ DPRINTF(("malloc failed"));
+ return (0);
+ }
/* Thread all of the updates onto a list of groups. */
INIT_LIST(zgrps);
memset(&tgrp, 0, sizeof (tgrp));
@@ -150,7 +156,7 @@ res_nupdate(res_state statp, ns_updrec *rrecp_in, ns_tsig_key *key) {
/* Marshall the update message. */
n = res_nmkupdate(statp, HEAD(zptr->z_rrlist),
- packet, sizeof packet);
+ packet, NS_MAXMSG);
DPRINTF(("res_mkupdate -> %d", n));
if (n < 0)
goto done;
@@ -188,6 +194,7 @@ res_nupdate(res_state statp, ns_updrec *rrecp_in, ns_tsig_key *key) {
if (nscount != 0)
res_setservers(statp, nsaddrs, nscount);
+ free(packet);
return (nzones);
}
OpenPOWER on IntegriCloud