From a4081690eeec13080905e94cd8a17fb257bd54a8 Mon Sep 17 00:00:00 2001 From: itojun <> Date: Mon, 20 Aug 2001 02:23:33 +0000 Subject: cope with negative return value from snprintf. --- src/lib/libc/net/getnameinfo.c | 37 +++++++++++++++++++++++++------------ 1 file changed, 25 insertions(+), 12 deletions(-) diff --git a/src/lib/libc/net/getnameinfo.c b/src/lib/libc/net/getnameinfo.c index 0906686fa6..0dee5a6c4c 100644 --- a/src/lib/libc/net/getnameinfo.c +++ b/src/lib/libc/net/getnameinfo.c @@ -1,4 +1,4 @@ -/* $OpenBSD: getnameinfo.c,v 1.18 2000/09/25 22:52:57 itojun Exp $ */ +/* $OpenBSD: getnameinfo.c,v 1.19 2001/08/20 02:23:33 itojun Exp $ */ /* $KAME: getnameinfo.c,v 1.45 2000/09/25 22:43:56 itojun Exp $ */ /* @@ -315,17 +315,18 @@ ip6_parsenumeric(sa, addr, host, hostlen, flags) char scopebuf[MAXHOSTNAMELEN]; int scopelen; - /* ip6_sa2str never fails */ - scopelen = ip6_sa2str((const struct sockaddr_in6 *)sa, - scopebuf, sizeof(scopebuf), - flags); + scopelen = ip6_sa2str( + (const struct sockaddr_in6 *)(const void *)sa, + scopebuf, sizeof(scopebuf), 0); + if (scopelen < 0) + return ENI_MEMORY; if (scopelen + 1 + numaddrlen + 1 > hostlen) return ENI_MEMORY; /* * construct <numeric-addr><delim><scopeid> */ memcpy(host + numaddrlen + 1, scopebuf, - scopelen); + (size_t)scopelen); host[numaddrlen] = SCOPE_DELIMITER; host[numaddrlen + 1 + scopelen] = '\0'; } @@ -343,12 +344,20 @@ ip6_sa2str(sa6, buf, bufsiz, flags) size_t bufsiz; int flags; { - unsigned int ifindex = (unsigned int)sa6->sin6_scope_id; - const struct in6_addr *a6 = &sa6->sin6_addr; + unsigned int ifindex; + const struct in6_addr *a6; + int n; + + ifindex = (unsigned int)sa6->sin6_scope_id; + a6 = &sa6->sin6_addr; -#ifdef notyet - if (flags & NI_NUMERICSCOPE) { - return(snprintf(buf, bufsiz, "%d", sa6->sin6_scope_id)); +#ifdef notdef + if ((flags & NI_NUMERICSCOPE) != 0) { + n = snprintf(buf, bufsiz, "%u", sa6->sin6_scope_id); + if (n < 0 || n >= bufsiz) + return -1; + else + return n; } #endif @@ -362,6 +371,10 @@ ip6_sa2str(sa6, buf, bufsiz, flags) } /* last resort */ - return(snprintf(buf, bufsiz, "%u", sa6->sin6_scope_id)); + n = snprintf(buf, bufsiz, "%u", sa6->sin6_scope_id); + if (n < 0 || n >= bufsiz) + return -1; + else + return n; } #endif /* INET6 */ -- cgit v1.2.3-55-g6feb