diff options
| author | jca <> | 2025-12-08 13:30:08 +0000 |
|---|---|---|
| committer | jca <> | 2025-12-08 13:30:08 +0000 |
| commit | 2a9ce651b1c5e84f70570a283e2a5ccd1e14eb25 (patch) | |
| tree | 4cd0b4bac0df189379851682a739ad008f0828a6 /src/lib/libc/net | |
| parent | 060807bc824ed30baf14bd749db43e4d90d310ad (diff) | |
| download | openbsd-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/libc/net')
| -rw-r--r-- | src/lib/libc/net/freeaddrinfo.c | 10 | ||||
| -rw-r--r-- | src/lib/libc/net/getaddrinfo.3 | 8 |
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 | } |
| 50 | DEF_WEAK(freeaddrinfo); | 54 | DEF_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 | ||
| 479 | The behavior of | ||
| 480 | .Fn freeaddrinfo "NULL" | ||
| 481 | is not specified and therefore not portable. | ||
