summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authoritojun <>2000-09-25 22:52:57 +0000
committeritojun <>2000-09-25 22:52:57 +0000
commitb8d571f7a917ee7e6a5117dcf667928c27d38c09 (patch)
treed4c7f3ffe5b68a4fdf468fa46953877489e1db31
parent0467d930e3693a74137bf8a37a46833c4f668483 (diff)
downloadopenbsd-b8d571f7a917ee7e6a5117dcf667928c27d38c09.tar.gz
openbsd-b8d571f7a917ee7e6a5117dcf667928c27d38c09.tar.bz2
openbsd-b8d571f7a917ee7e6a5117dcf667928c27d38c09.zip
fix off-by-1 error.
From: Pavel Kankovsky <peak@argo.troja.mff.cuni.cz>
-rw-r--r--src/lib/libc/net/getnameinfo.c17
1 files changed, 8 insertions, 9 deletions
diff --git a/src/lib/libc/net/getnameinfo.c b/src/lib/libc/net/getnameinfo.c
index 1cabee6b97..0906686fa6 100644
--- a/src/lib/libc/net/getnameinfo.c
+++ b/src/lib/libc/net/getnameinfo.c
@@ -1,5 +1,5 @@
1/* $OpenBSD: getnameinfo.c,v 1.17 2000/06/12 04:28:22 itojun Exp $ */ 1/* $OpenBSD: getnameinfo.c,v 1.18 2000/09/25 22:52:57 itojun Exp $ */
2/* $KAME: getnameinfo.c,v 1.43 2000/06/12 04:27:03 itojun Exp $ */ 2/* $KAME: getnameinfo.c,v 1.45 2000/09/25 22:43:56 itojun Exp $ */
3 3
4/* 4/*
5 * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project. 5 * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
@@ -33,11 +33,9 @@
33/* 33/*
34 * Issues to be discussed: 34 * Issues to be discussed:
35 * - Thread safe-ness must be checked 35 * - Thread safe-ness must be checked
36 * - Return values. There seems to be no standard for return value (RFC2553)
37 * but INRIA implementation returns EAI_xxx defined for getaddrinfo().
38 * - RFC2553 says that we should raise error on short buffer. X/Open says 36 * - RFC2553 says that we should raise error on short buffer. X/Open says
39 * we need to truncate the result. We obey RFC2553 (and X/Open should be 37 * we need to truncate the result. We obey RFC2553 (and X/Open should be
40 * modified). 38 * modified). ipngwg rough consensus seems to follow RFC2553.
41 * - What is "local" in NI_FQDN? 39 * - What is "local" in NI_FQDN?
42 * - NI_NAMEREQD and NI_NUMERICHOST conflict with each other. 40 * - NI_NAMEREQD and NI_NUMERICHOST conflict with each other.
43 * - (KAME extension) NI_WITHSCOPEID when called with global address, 41 * - (KAME extension) NI_WITHSCOPEID when called with global address,
@@ -91,6 +89,7 @@ static int ip6_parsenumeric __P((const struct sockaddr *, const char *, char *,
91static int ip6_sa2str __P((const struct sockaddr_in6 *, char *, size_t, int)); 89static int ip6_sa2str __P((const struct sockaddr_in6 *, char *, size_t, int));
92#endif 90#endif
93 91
92/* 2553bis: use EAI_xx for getnameinfo */
94#define ENI_NOSOCKET EAI_FAIL /*XXX*/ 93#define ENI_NOSOCKET EAI_FAIL /*XXX*/
95#define ENI_NOSERVNAME EAI_NONAME 94#define ENI_NOSERVNAME EAI_NONAME
96#define ENI_NOHOSTNAME EAI_NONAME 95#define ENI_NOHOSTNAME EAI_NONAME
@@ -157,12 +156,12 @@ getnameinfo(sa, salen, host, hostlen, serv, servlen, flags)
157 (flags & NI_DGRAM) ? "udp" : "tcp"); 156 (flags & NI_DGRAM) ? "udp" : "tcp");
158 } 157 }
159 if (sp) { 158 if (sp) {
160 if (strlen(sp->s_name) > servlen) 159 if (strlen(sp->s_name) + 1 > servlen)
161 return ENI_MEMORY; 160 return ENI_MEMORY;
162 strcpy(serv, sp->s_name); 161 strcpy(serv, sp->s_name);
163 } else { 162 } else {
164 snprintf(numserv, sizeof(numserv), "%d", ntohs(port)); 163 snprintf(numserv, sizeof(numserv), "%d", ntohs(port));
165 if (strlen(numserv) > servlen) 164 if (strlen(numserv) + 1 > servlen)
166 return ENI_MEMORY; 165 return ENI_MEMORY;
167 strcpy(serv, numserv); 166 strcpy(serv, numserv);
168 } 167 }
@@ -257,7 +256,7 @@ getnameinfo(sa, salen, host, hostlen, serv, servlen, flags)
257 *p = '\0'; 256 *p = '\0';
258 } 257 }
259#endif 258#endif
260 if (strlen(hp->h_name) > hostlen) { 259 if (strlen(hp->h_name) + 1 > hostlen) {
261 return ENI_MEMORY; 260 return ENI_MEMORY;
262 } 261 }
263 strcpy(host, hp->h_name); 262 strcpy(host, hp->h_name);
@@ -319,7 +318,7 @@ ip6_parsenumeric(sa, addr, host, hostlen, flags)
319 /* ip6_sa2str never fails */ 318 /* ip6_sa2str never fails */
320 scopelen = ip6_sa2str((const struct sockaddr_in6 *)sa, 319 scopelen = ip6_sa2str((const struct sockaddr_in6 *)sa,
321 scopebuf, sizeof(scopebuf), 320 scopebuf, sizeof(scopebuf),
322 0); 321 flags);
323 if (scopelen + 1 + numaddrlen + 1 > hostlen) 322 if (scopelen + 1 + numaddrlen + 1 > hostlen)
324 return ENI_MEMORY; 323 return ENI_MEMORY;
325 /* 324 /*