diff options
Diffstat (limited to 'src/lib/libc/net/gethostnamadr.c')
| -rw-r--r-- | src/lib/libc/net/gethostnamadr.c | 17 |
1 files changed, 12 insertions, 5 deletions
diff --git a/src/lib/libc/net/gethostnamadr.c b/src/lib/libc/net/gethostnamadr.c index 5211f423c6..7cf419fdb1 100644 --- a/src/lib/libc/net/gethostnamadr.c +++ b/src/lib/libc/net/gethostnamadr.c | |||
| @@ -52,7 +52,7 @@ | |||
| 52 | */ | 52 | */ |
| 53 | 53 | ||
| 54 | #if defined(LIBC_SCCS) && !defined(lint) | 54 | #if defined(LIBC_SCCS) && !defined(lint) |
| 55 | static char rcsid[] = "$OpenBSD: gethostnamadr.c,v 1.54 2003/01/28 04:58:00 marc Exp $"; | 55 | static char rcsid[] = "$OpenBSD: gethostnamadr.c,v 1.55 2003/03/04 00:29:17 itojun Exp $"; |
| 56 | #endif /* LIBC_SCCS and not lint */ | 56 | #endif /* LIBC_SCCS and not lint */ |
| 57 | 57 | ||
| 58 | #include <sys/param.h> | 58 | #include <sys/param.h> |
| @@ -664,7 +664,7 @@ gethostbyaddr(addr, len, af) | |||
| 664 | int n, size, i; | 664 | int n, size, i; |
| 665 | querybuf *buf; | 665 | querybuf *buf; |
| 666 | register struct hostent *hp; | 666 | register struct hostent *hp; |
| 667 | char qbuf[MAXDNAME+1], *qp; | 667 | char qbuf[MAXDNAME+1], *qp, *ep; |
| 668 | extern struct hostent *_gethtbyaddr(), *_yp_gethtbyaddr(); | 668 | extern struct hostent *_gethtbyaddr(), *_yp_gethtbyaddr(); |
| 669 | char lookups[MAXDNSLUS]; | 669 | char lookups[MAXDNSLUS]; |
| 670 | struct hostent *res; | 670 | struct hostent *res; |
| @@ -706,6 +706,7 @@ gethostbyaddr(addr, len, af) | |||
| 706 | h_errno = NETDB_INTERNAL; | 706 | h_errno = NETDB_INTERNAL; |
| 707 | return (NULL); | 707 | return (NULL); |
| 708 | } | 708 | } |
| 709 | ep = qbuf + sizeof(qbuf); | ||
| 709 | switch (af) { | 710 | switch (af) { |
| 710 | case AF_INET: | 711 | case AF_INET: |
| 711 | (void) snprintf(qbuf, sizeof qbuf, "%u.%u.%u.%u.in-addr.arpa", | 712 | (void) snprintf(qbuf, sizeof qbuf, "%u.%u.%u.%u.in-addr.arpa", |
| @@ -715,8 +716,14 @@ gethostbyaddr(addr, len, af) | |||
| 715 | case AF_INET6: | 716 | case AF_INET6: |
| 716 | qp = qbuf; | 717 | qp = qbuf; |
| 717 | for (n = IN6ADDRSZ - 1; n >= 0; n--) { | 718 | for (n = IN6ADDRSZ - 1; n >= 0; n--) { |
| 718 | qp += sprintf(qp, "%x.%x.", | 719 | i = snprintf(qp, ep - qp, "%x.%x.", |
| 719 | uaddr[n] & 0xf, (uaddr[n] >> 4) & 0xf); | 720 | uaddr[n] & 0xf, (uaddr[n] >> 4) & 0xf); |
| 721 | if (i <= 0) { | ||
| 722 | errno = EINVAL; | ||
| 723 | h_errno = NETDB_INTERNAL; | ||
| 724 | return (NULL); | ||
| 725 | } | ||
| 726 | qp += i; | ||
| 720 | } | 727 | } |
| 721 | break; | 728 | break; |
| 722 | } | 729 | } |
| @@ -737,14 +744,14 @@ gethostbyaddr(addr, len, af) | |||
| 737 | #endif | 744 | #endif |
| 738 | case 'b': | 745 | case 'b': |
| 739 | if (af == AF_INET6) | 746 | if (af == AF_INET6) |
| 740 | strcpy(qp, "ip6.arpa"); | 747 | strlcpy(qp, "ip6.arpa", ep - qp); |
| 741 | buf = malloc(sizeof(*buf)); | 748 | buf = malloc(sizeof(*buf)); |
| 742 | if (!buf) | 749 | if (!buf) |
| 743 | break; | 750 | break; |
| 744 | n = res_query(qbuf, C_IN, T_PTR, buf->buf, | 751 | n = res_query(qbuf, C_IN, T_PTR, buf->buf, |
| 745 | sizeof(buf->buf)); | 752 | sizeof(buf->buf)); |
| 746 | if (n < 0 && af == AF_INET6) { | 753 | if (n < 0 && af == AF_INET6) { |
| 747 | strcpy(qp, "ip6.int"); | 754 | strlcpy(qp, "ip6.int", ep - qp); |
| 748 | n = res_query(qbuf, C_IN, T_PTR, | 755 | n = res_query(qbuf, C_IN, T_PTR, |
| 749 | buf->buf, sizeof(buf->buf)); | 756 | buf->buf, sizeof(buf->buf)); |
| 750 | } | 757 | } |
