aboutsummaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorKonstantin Belousov <kib@FreeBSD.org>2017-09-14 19:18:24 +0000
committerKonstantin Belousov <kib@FreeBSD.org>2017-09-14 19:18:24 +0000
commit587e285e97a0baf6e0a46c7b5eb04a697320d87d (patch)
treea2563d29663f5d9cc906d3b3a01b2d617cc8337a /lib
parent314e8196ea0014cee4d3d40b9f60d9e90e6fcded (diff)
downloadsrc-587e285e97a0baf6e0a46c7b5eb04a697320d87d.tar.gz
src-587e285e97a0baf6e0a46c7b5eb04a697320d87d.zip
Silently handle freeaddrinfo(NULL) for compatibility with code which
works on other OSes. Also avoid unnecessary NULL check, free(NULL) is valid. Reviewed by: bjk (man page), hrs, hselasky, ume Sponsored by: Mellanox Technologies MFC after: 1 week Differential revision: https://reviews.freebsd.org/D12354
Notes
Notes: svn path=/head/; revision=323597
Diffstat (limited to 'lib')
-rw-r--r--lib/libc/net/getaddrinfo.313
-rw-r--r--lib/libc/net/getaddrinfo.c9
2 files changed, 16 insertions, 6 deletions
diff --git a/lib/libc/net/getaddrinfo.3 b/lib/libc/net/getaddrinfo.3
index 7380428e9fb3..fdfaddb98b0e 100644
--- a/lib/libc/net/getaddrinfo.3
+++ b/lib/libc/net/getaddrinfo.3
@@ -18,7 +18,7 @@
.\"
.\" $FreeBSD$
.\"
-.Dd December 21, 2015
+.Dd September 13, 2017
.Dt GETADDRINFO 3
.Os
.Sh NAME
@@ -351,6 +351,17 @@ pointer should be a
.Li addrinfo
structure created by a call to
.Fn getaddrinfo .
+.Sh IMPLEMENTATION NOTES
+The behavior of
+.Li freeadrinfo(NULL)
+is left unspecified by both
+.St -susv4
+and
+.Dv "RFC 3493" .
+The current implementation ignores a
+.Dv NULL
+argument for compatibility with programs that rely on the implementation
+details of other operating systems.
.Sh RETURN VALUES
.Fn getaddrinfo
returns zero on success or one of the error codes listed in
diff --git a/lib/libc/net/getaddrinfo.c b/lib/libc/net/getaddrinfo.c
index 5988ebc1372b..d70502870024 100644
--- a/lib/libc/net/getaddrinfo.c
+++ b/lib/libc/net/getaddrinfo.c
@@ -35,7 +35,7 @@
* in the source code. This is because RFC2553 is silent about which error
* code must be returned for which situation.
* - freeaddrinfo(NULL). RFC2553 is silent about it. XNET 5.2 says it is
- * invalid. current code - SEGV on freeaddrinfo(NULL)
+ * invalid. Current code accepts NULL to be compatible with other OSes.
*
* Note:
* - The code filters out AFs that are not supported by the kernel,
@@ -359,14 +359,13 @@ freeaddrinfo(struct addrinfo *ai)
{
struct addrinfo *next;
- do {
+ while (ai != NULL) {
next = ai->ai_next;
- if (ai->ai_canonname)
- free(ai->ai_canonname);
+ free(ai->ai_canonname);
/* no need to free(ai->ai_addr) */
free(ai);
ai = next;
- } while (ai);
+ }
}
static int