diff options
author | itojun <> | 2003-03-04 00:29:17 +0000 |
---|---|---|
committer | itojun <> | 2003-03-04 00:29:17 +0000 |
commit | 81f5994daeaee763274ed3a99805c77e55b46a6d (patch) | |
tree | f9be9b5430f88e19b76736abb4020b24219b9dff /src/lib/libc/net/gethostnamadr.c | |
parent | 9464e28cab6e9f9e7df083a4bcef97ec8b721535 (diff) | |
download | openbsd-81f5994daeaee763274ed3a99805c77e55b46a6d.tar.gz openbsd-81f5994daeaee763274ed3a99805c77e55b46a6d.tar.bz2 openbsd-81f5994daeaee763274ed3a99805c77e55b46a6d.zip |
strlcpy, check retval from sprintf
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 | } |