diff options
author | itojun <> | 2000-09-25 22:52:57 +0000 |
---|---|---|
committer | itojun <> | 2000-09-25 22:52:57 +0000 |
commit | b8d571f7a917ee7e6a5117dcf667928c27d38c09 (patch) | |
tree | d4c7f3ffe5b68a4fdf468fa46953877489e1db31 | |
parent | 0467d930e3693a74137bf8a37a46833c4f668483 (diff) | |
download | openbsd-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.c | 17 |
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 *, | |||
91 | static int ip6_sa2str __P((const struct sockaddr_in6 *, char *, size_t, int)); | 89 | static 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 | /* |