summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorume <ume@FreeBSD.org>2006-05-21 11:22:31 +0000
committerume <ume@FreeBSD.org>2006-05-21 11:22:31 +0000
commitc49929798600cc98625b30e672dfe77235791a07 (patch)
treea82b4c284a5ddf2b821903c9504a21a50b34beb7
parent2103e7a60f93b5663802fad9b458412411640d7c (diff)
downloadFreeBSD-src-c49929798600cc98625b30e672dfe77235791a07.zip
FreeBSD-src-c49929798600cc98625b30e672dfe77235791a07.tar.gz
Return EAI_OVERFLOW instead of EAI_MEMORY when the supplied buffer is
too short. This conforms to RFC3493, POSIX and XPG6. Obtained from: NetBSD
-rw-r--r--include/netdb.h7
-rw-r--r--lib/libc/net/gai_strerror.32
-rw-r--r--lib/libc/net/gai_strerror.c3
-rw-r--r--lib/libc/net/getnameinfo.c6
4 files changed, 11 insertions, 7 deletions
diff --git a/include/netdb.h b/include/netdb.h
index 6e7d818..33a5051 100644
--- a/include/netdb.h
+++ b/include/netdb.h
@@ -168,9 +168,10 @@ struct addrinfo {
#define EAI_SERVICE 9 /* servname not supported for ai_socktype */
#define EAI_SOCKTYPE 10 /* ai_socktype not supported */
#define EAI_SYSTEM 11 /* system error returned in errno */
-#define EAI_BADHINTS 12
-#define EAI_PROTOCOL 13
-#define EAI_MAX 14
+#define EAI_BADHINTS 12 /* invalid value for hints */
+#define EAI_PROTOCOL 13 /* resolved protocol is unknown */
+#define EAI_OVERFLOW 14 /* argument buffer overflow */
+#define EAI_MAX 15
/*
* Flag values for getaddrinfo()
diff --git a/lib/libc/net/gai_strerror.3 b/lib/libc/net/gai_strerror.3
index 7c55030..51d0d07 100644
--- a/lib/libc/net/gai_strerror.3
+++ b/lib/libc/net/gai_strerror.3
@@ -63,6 +63,8 @@ memory allocation failure
or
.Fa servname
not provided, or not known
+.It Dv EAI_OVERFLOW
+argument buffer overflow
.It Dv EAI_PROTOCOL
resolved protocol is unknown
.It Dv EAI_SERVICE
diff --git a/lib/libc/net/gai_strerror.c b/lib/libc/net/gai_strerror.c
index bd351ab..5611559 100644
--- a/lib/libc/net/gai_strerror.c
+++ b/lib/libc/net/gai_strerror.c
@@ -48,7 +48,8 @@ static const char *ai_errlist[] = {
"ai_socktype not supported", /* EAI_SOCKTYPE */
"System error returned in errno", /* EAI_SYSTEM */
"Invalid value for hints", /* EAI_BADHINTS */
- "Resolved protocol is unknown" /* EAI_PROTOCOL */
+ "Resolved protocol is unknown", /* EAI_PROTOCOL */
+ "Argument buffer overflow" /* EAI_OVERFLOW */
};
const char *
diff --git a/lib/libc/net/getnameinfo.c b/lib/libc/net/getnameinfo.c
index b14cc27..ed1e3af 100644
--- a/lib/libc/net/getnameinfo.c
+++ b/lib/libc/net/getnameinfo.c
@@ -280,7 +280,7 @@ ip6_parsenumeric(const struct sockaddr *sa, const char *addr,
numaddrlen = strlen(numaddr);
if (numaddrlen + 1 > hostlen) /* don't forget terminator */
- return EAI_MEMORY;
+ return EAI_OVERFLOW;
strlcpy(host, numaddr, hostlen);
if (((const struct sockaddr_in6 *)sa)->sin6_scope_id) {
@@ -291,9 +291,9 @@ ip6_parsenumeric(const struct sockaddr *sa, const char *addr,
(const struct sockaddr_in6 *)(const void *)sa,
zonebuf, sizeof(zonebuf), flags);
if (zonelen < 0)
- return EAI_MEMORY;
+ return EAI_OVERFLOW;
if (zonelen + 1 + numaddrlen + 1 > hostlen)
- return EAI_MEMORY;
+ return EAI_OVERFLOW;
/* construct <numeric-addr><delim><zoneid> */
memcpy(host + numaddrlen + 1, zonebuf,
OpenPOWER on IntegriCloud