Arne Schwabe <a...@rfc2549.org> [2023-02-09 17:03:31]: > Am 09.02.23 um 16:53 schrieb Arne Schwabe: > > Am 09.02.23 um 16:36 schrieb Petr Štetiar: > > > Server can crash on systems using musl libc when client with comma in > > > commonName tries to connect: > > > > > > ifconfig_pool_read(), in='VPN Client, abc,192.168.1.2,' > > > RESOLVE: Cannot parse IP address: abc: (Name does not resolve) > > > > > > as this leads to NULL pointer dereference in freeaddrinfo(): > > > > > > Program received signal SIGSEGV, Segmentation fault. > > > 0x00007ffff7fbf81a in freeaddrinfo (p=0x0) at > > > src/network/freeaddrinfo.c:10 > > > (gdb) bt > > > #0 0x00007ffff7fbf81a in freeaddrinfo (p=0x0) at > > > src/network/freeaddrinfo.c:10 > > > #1 0x00000000004389ec in get_addr_generic (af=af@entry=2, > > > flags=flags@entry=4, hostname=hostname@entry=0x7ffff7ee2988 " abc", > > > network=network@entry=0x7fffffffcb7c, netbits=netbits@entry=0x0, > > > resolve_retry_seconds=resolve_retry_seconds@entry=0, > > > signal_received=0x0, msglevel=64) at > > > openvpn-2.5.7/src/openvpn/socket.c:186 > > > #2 0x0000000000438a2d in getaddr (flags=flags@entry=4, > > > hostname=hostname@entry=0x7ffff7ee2988 " abc", > > > resolve_retry_seconds=resolve_retry_seconds@entry=0, > > > succeeded=succeeded@entry=0x7fffffffcba7, > > > signal_received=signal_received@entry=0x0) at > > > openvpn-2.5.7/src/openvpn/socket.c:202 > > > #3 0x0000000000430ae5 in ifconfig_pool_read > > > (persist=0x7ffff7ee4510, pool=0x7ffff7edd450) at > > > openvpn-2.5.7/src/openvpn/pool.c:661 > > > > > > So fix it by checking if `struct addrinfo*` pointer is valid before > > > passing it down to freeaddrinfo(). > > > > I am bit surprised that freeadrinfo does not follow the usual semantics > > of calling freesomething on a nullptr is a noop. > > > > If this is really the case would should add similar code (with comments > > that freeaddrinfo is special here) also in gc_freeaddrinfo_callback and > > the other places that call it without checking for ai to be valid. > > > > So FreeBSD has: > > * - freeaddrinfo(NULL). RFC2553 is silent about it. XNET 5.2 says it is > * invalid. Current code accepts NULL to be compatible with other OSes. > > and android bionic has a similar comment (bionic is also BSD libc based): > > * - freeaddrinfo(NULL). RFC2553 is silent about it. XNET 5.2 says it is > * invalid. > * current code - SEGV on freeaddrinfo(NULL) > > but then actually does nothing on ai == NULL: > > #if defined(__BIONIC__) > if (ai == NULL) return; > #else > _DIAGASSERT(ai != NULL); > #endif > > so it seems that apart from some implementations like musl this assumption > that freeaddrinfo is a noop is kind of true. I would still open a report > against musl to fix this as this seem to be better to be aligned with the > rest of the world.
https://www.openwall.com/lists/musl/2019/03/26/18 _______________________________________________ Openvpn-devel mailing list Openvpn-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/openvpn-devel