summaryrefslogtreecommitdiff
path: root/src/lib
diff options
context:
space:
mode:
authorjca <>2025-12-08 13:30:08 +0000
committerjca <>2025-12-08 13:30:08 +0000
commit2a9ce651b1c5e84f70570a283e2a5ccd1e14eb25 (patch)
tree4cd0b4bac0df189379851682a739ad008f0828a6 /src/lib
parent060807bc824ed30baf14bd749db43e4d90d310ad (diff)
downloadopenbsd-2a9ce651b1c5e84f70570a283e2a5ccd1e14eb25.tar.gz
openbsd-2a9ce651b1c5e84f70570a283e2a5ccd1e14eb25.tar.bz2
openbsd-2a9ce651b1c5e84f70570a283e2a5ccd1e14eb25.zip
Do not crash when calling freeaddrinfo(NULL)
Supported by Linux since at least 1997, and FreeBSD since 2017. While not defined, there's no real good reason to crash when we could just cope. Indeed, software out there relies on the Linux behavior. Point out in the manpage that the behavior of getaddrinfo(NULL) isn't defined and thus isn't portable. Edge case spotted recently by kn@ in OpenVPN. ok millert@ djm@ deraadt@ kn@
Diffstat (limited to 'src/lib')
-rw-r--r--src/lib/libc/net/freeaddrinfo.c10
-rw-r--r--src/lib/libc/net/getaddrinfo.38
2 files changed, 13 insertions, 5 deletions
diff --git a/src/lib/libc/net/freeaddrinfo.c b/src/lib/libc/net/freeaddrinfo.c
index 154f70cd75..c06318fb75 100644
--- a/src/lib/libc/net/freeaddrinfo.c
+++ b/src/lib/libc/net/freeaddrinfo.c
@@ -1,4 +1,4 @@
1/* $OpenBSD: freeaddrinfo.c,v 1.9 2016/09/21 04:38:56 guenther Exp $ */ 1/* $OpenBSD: freeaddrinfo.c,v 1.10 2025/12/08 13:30:08 jca Exp $ */
2 2
3/* 3/*
4 * Copyright (c) 1996, 1997, 1998, 1999, Craig Metz, All rights reserved. 4 * Copyright (c) 1996, 1997, 1998, 1999, Craig Metz, All rights reserved.
@@ -40,11 +40,15 @@ freeaddrinfo(struct addrinfo *ai)
40{ 40{
41 struct addrinfo *p; 41 struct addrinfo *p;
42 42
43 do { 43 /*
44 * Calling freeaddrinfo() with a NULL pointer is unspecified,
45 * but try to cope with it anyway for compatibility.
46 */
47 while (ai != NULL) {
44 p = ai; 48 p = ai;
45 ai = ai->ai_next; 49 ai = ai->ai_next;
46 free(p->ai_canonname); 50 free(p->ai_canonname);
47 free(p); 51 free(p);
48 } while (ai); 52 }
49} 53}
50DEF_WEAK(freeaddrinfo); 54DEF_WEAK(freeaddrinfo);
diff --git a/src/lib/libc/net/getaddrinfo.3 b/src/lib/libc/net/getaddrinfo.3
index 780c7a409f..2df5fbe896 100644
--- a/src/lib/libc/net/getaddrinfo.3
+++ b/src/lib/libc/net/getaddrinfo.3
@@ -1,4 +1,4 @@
1.\" $OpenBSD: getaddrinfo.3,v 1.61 2022/09/11 06:38:10 jmc Exp $ 1.\" $OpenBSD: getaddrinfo.3,v 1.62 2025/12/08 13:30:08 jca Exp $
2.\" $KAME: getaddrinfo.3,v 1.36 2005/01/05 03:23:05 itojun Exp $ 2.\" $KAME: getaddrinfo.3,v 1.36 2005/01/05 03:23:05 itojun Exp $
3.\" 3.\"
4.\" Copyright (C) 2004 Internet Systems Consortium, Inc. ("ISC") 4.\" Copyright (C) 2004 Internet Systems Consortium, Inc. ("ISC")
@@ -16,7 +16,7 @@
16.\" OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR 16.\" OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
17.\" PERFORMANCE OF THIS SOFTWARE. 17.\" PERFORMANCE OF THIS SOFTWARE.
18.\" 18.\"
19.Dd $Mdocdate: September 11 2022 $ 19.Dd $Mdocdate: December 8 2025 $
20.Dt GETADDRINFO 3 20.Dt GETADDRINFO 3
21.Os 21.Os
22.Sh NAME 22.Sh NAME
@@ -475,3 +475,7 @@ flag bit first appeared in Windows 7.
475.%R RFC 4007 475.%R RFC 4007
476.%T IPv6 Scoped Address Architecture 476.%T IPv6 Scoped Address Architecture
477.Re 477.Re
478.Sh CAVEATS
479The behavior of
480.Fn freeaddrinfo "NULL"
481is not specified and therefore not portable.