summaryrefslogtreecommitdiff
path: root/src/lib/libc/net/gethostnamadr.c
diff options
context:
space:
mode:
authoritojun <>2003-03-04 00:29:17 +0000
committeritojun <>2003-03-04 00:29:17 +0000
commit81f5994daeaee763274ed3a99805c77e55b46a6d (patch)
treef9be9b5430f88e19b76736abb4020b24219b9dff /src/lib/libc/net/gethostnamadr.c
parent9464e28cab6e9f9e7df083a4bcef97ec8b721535 (diff)
downloadopenbsd-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.c17
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)
55static char rcsid[] = "$OpenBSD: gethostnamadr.c,v 1.54 2003/01/28 04:58:00 marc Exp $"; 55static 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 }