summaryrefslogtreecommitdiff
path: root/usr.sbin/named/libresolv/gethnamaddr.c
diff options
context:
space:
mode:
Diffstat (limited to 'usr.sbin/named/libresolv/gethnamaddr.c')
-rw-r--r--usr.sbin/named/libresolv/gethnamaddr.c48
1 files changed, 29 insertions, 19 deletions
diff --git a/usr.sbin/named/libresolv/gethnamaddr.c b/usr.sbin/named/libresolv/gethnamaddr.c
index aa93b257643..e60164b728d 100644
--- a/usr.sbin/named/libresolv/gethnamaddr.c
+++ b/usr.sbin/named/libresolv/gethnamaddr.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: gethnamaddr.c,v 1.1 1997/03/12 10:42:02 downsj Exp $ */
+/* $OpenBSD: gethnamaddr.c,v 1.2 1998/05/22 00:47:18 millert Exp $ */
/*
* ++Copyright++ 1985, 1988, 1993
@@ -58,9 +58,9 @@
#if defined(LIBC_SCCS) && !defined(lint)
#if 0
static char sccsid[] = "@(#)gethostnamadr.c 8.1 (Berkeley) 6/4/93";
-static char rcsid[] = "$From: gethnamaddr.c,v 8.20 1996/09/28 06:51:07 vixie Exp $";
+static char rcsid[] = "$From: gethnamaddr.c,v 8.21 1997/06/01 20:34:37 vixie Exp $";
#else
-static char rcsid[] = "$OpenBSD: gethnamaddr.c,v 1.1 1997/03/12 10:42:02 downsj Exp $";
+static char rcsid[] = "$OpenBSD: gethnamaddr.c,v 1.2 1998/05/22 00:47:18 millert Exp $";
#endif
#endif /* LIBC_SCCS and not lint */
@@ -216,6 +216,10 @@ getanswer(answer, anslen, qname, qtype)
* (i.e., with the succeeding search-domain tacked on).
*/
n = strlen(bp) + 1; /* for the \0 */
+ if (n >= MAXHOSTNAMELEN) {
+ h_errno = NO_RECOVERY;
+ return (NULL);
+ }
host.h_name = bp;
bp += n;
buflen -= n;
@@ -260,11 +264,15 @@ getanswer(answer, anslen, qname, qtype)
/* Store alias. */
*ap++ = bp;
n = strlen(bp) + 1; /* for the \0 */
+ if (n >= MAXHOSTNAMELEN) {
+ had_error++;
+ continue;
+ }
bp += n;
buflen -= n;
/* Get canonical name. */
n = strlen(tbuf) + 1; /* for the \0 */
- if (n > buflen) {
+ if (n > buflen || n >= MAXHOSTNAMELEN) {
had_error++;
continue;
}
@@ -276,14 +284,14 @@ getanswer(answer, anslen, qname, qtype)
}
if (qtype == T_PTR && type == T_CNAME) {
n = dn_expand(answer->buf, eom, cp, tbuf, sizeof tbuf);
- if ((n < 0) || !res_hnok(tbuf)) {
+ if (n < 0 || !res_dnok(tbuf)) {
had_error++;
continue;
}
cp += n;
/* Get canonical name. */
n = strlen(tbuf) + 1; /* for the \0 */
- if (n > buflen) {
+ if (n > buflen || n >= MAXHOSTNAMELEN) {
had_error++;
continue;
}
@@ -324,6 +332,10 @@ getanswer(answer, anslen, qname, qtype)
n = -1;
if (n != -1) {
n = strlen(bp) + 1; /* for the \0 */
+ if (n >= MAXHOSTNAMELEN) {
+ had_error++;
+ break;
+ }
bp += n;
buflen -= n;
}
@@ -332,6 +344,10 @@ getanswer(answer, anslen, qname, qtype)
host.h_name = bp;
if (_res.options & RES_USE_INET6) {
n = strlen(bp) + 1; /* for the \0 */
+ if (n >= MAXHOSTNAMELEN) {
+ had_error++;
+ break;
+ }
bp += n;
buflen -= n;
map_v4v6_hostent(&host, &bp, &buflen);
@@ -399,8 +415,8 @@ getanswer(answer, anslen, qname, qtype)
# endif /*RESOLVSORT*/
if (!host.h_name) {
n = strlen(qname) + 1; /* for the \0 */
- if (n > buflen)
- goto try_again;
+ if (n > buflen || n >= MAXHOSTNAMELEN)
+ goto no_recovery;
strcpy(bp, qname);
host.h_name = bp;
bp += n;
@@ -411,8 +427,8 @@ getanswer(answer, anslen, qname, qtype)
h_errno = NETDB_SUCCESS;
return (&host);
}
- try_again:
- h_errno = TRY_AGAIN;
+ no_recovery:
+ h_errno = NO_RECOVERY;
return (NULL);
}
@@ -512,7 +528,8 @@ gethostbyname2(name, af)
if (!isdigit(*cp) && *cp != '.')
break;
}
- if (isxdigit(name[0]) || name[0] == ':')
+ if ((isxdigit(name[0]) && strchr(name, ':') != NULL) ||
+ name[0] == ':')
for (cp = name;; ++cp) {
if (!*cp) {
if (*--cp == '.')
@@ -721,8 +738,7 @@ _gethtent()
if (!(cp = strpbrk(p, " \t")))
goto again;
*cp++ = '\0';
- if ((_res.options & RES_USE_INET6) &&
- inet_pton(AF_INET6, p, host_addr) > 0) {
+ if (inet_pton(AF_INET6, p, host_addr) > 0) {
af = AF_INET6;
len = IN6ADDRSZ;
} else if (inet_pton(AF_INET, p, host_addr) > 0) {
@@ -759,12 +775,6 @@ _gethtent()
*cp++ = '\0';
}
*q = NULL;
- if (_res.options & RES_USE_INET6) {
- char *bp = hostbuf;
- int buflen = sizeof hostbuf;
-
- map_v4v6_hostent(&host, &bp, &buflen);
- }
h_errno = NETDB_SUCCESS;
return (&host);
}