diff options
Diffstat (limited to 'contrib/bind/lib')
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 7c9e481e5df9..e1173c65677f 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 6c2bdaede0b5..5d2207454d85 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 cc2a7e4814cc..e5f8cdb6faa2 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 12e22a8b24e4..b6895242c4e2 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 a62234556a68..b314f113d59c 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 6c0a6e7373fe..1b37e3d999f9 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 f39a59a05a2c..a322f4494628 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 4b1b282fe0c8..9a7af3df02a1 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 243f10656c3c..89db519fcfd7 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 8e7e7179f66b..3964b5f13472 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 9b26c641ff67..702b932bf39a 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 e966ea6b6234..9c13b01eeae6 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 adae817e1303..0a88ea4eb060 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 2b0891150675..5afe6611ee42 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 0f68b28973ea..8a02b1b757fc 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 000da0c7b153..f69a6b45a3c2 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 b4e09453c4cd..0ea50f5246d9 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 72a8d17a5e90..7158f4c7b3c3 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 56e50981dfb8..13d71d5e078b 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 91a2c1b0eede..835bcd4a0c27 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 c6bcab675614..3a6894be1e45 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 03436c601cae..0f3c56f1982c 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 9608424014f5..8d9fa8d4e6c3 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 0e527336ee07..c7b1272134af 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 78f010016f7e..71b95eda9ff8 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 ca7ea04c0bcf..f0a4940a1184 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 fff96f494007..c57ac3bd3a61 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 f3f92c68d7ce..abd48f2edeae 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 b23f805ac8b1..f8a85e7b5277 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 da6f3b629e98..6394701f4cb5 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 8c5fe1d79f3f..de8cd1418fdf 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 d9728482e788..15de91a7b1bc 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 f2c0689f90f9..392796a7c9fa 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 a82c3f10aded..018ec4d04281 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 9f99d14fbc9f..7e507be1ae9c 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 7041227ac9ec..a45d89b31415 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 6071360e0b51..3928f9f6225d 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 ec9b384b9116..d7b66cd691bc 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 61f5df9bc713..cda076cf485b 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 6f0e430a9f40..2adc608463c0 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 12ee326f7f21..35c9b07c4753 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); } |