From 7d3c6f1c43522e70b071396951f5b68724463883 Mon Sep 17 00:00:00 2001 From: Luis Dallos Date: Mon, 1 Aug 2022 23:00:25 -0400 Subject: [PATCH] Fix startup failure on Windows 8.1 due to unsupported IPV6_USER_MTU socket option being set Newer mingw-w64 (starting from 8.0.1) introduces support for `IPV6_USER_MTU` socket option [1], which is not supported on Windows 8.1 and older [2]. As there is no way to avoid this socket option from being picked at compile time when targeting older versions of Windows, check for `setsockopt(..., IPV6_USER_MTU, ...)` failures at runtime in order to avoid startup failure on those versions of Windows where the `IPV6_USER_MTU` socket option is unsupported. [1]: mirror/mingw-w64@e30bff4 [2]: `WSAGetLastError()` returns `WSAENOPROTOOPT` (`Bad protocol option`) error code --- services/listen_dnsport.c | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/services/listen_dnsport.c b/services/listen_dnsport.c index 1c7c177a0..467419b09 100644 --- a/services/listen_dnsport.c +++ b/services/listen_dnsport.c @@ -511,12 +511,14 @@ create_udp_sock(int family, int socktype, struct sockaddr* addr, * instead which is writable; IPV6_MTU is readonly there. */ if (setsockopt(s, IPPROTO_IPV6, IPV6_USER_MTU, (void*)&mtu, (socklen_t)sizeof(mtu)) < 0) { - log_err("setsockopt(..., IPV6_USER_MTU, ...) failed: %s", - wsa_strerror(WSAGetLastError())); - sock_close(s); - *noproto = 0; - *inuse = 0; - return -1; + if (WSAGetLastError() != WSAENOPROTOOPT) { + log_err("setsockopt(..., IPV6_USER_MTU, ...) failed: %s", + wsa_strerror(WSAGetLastError())); + sock_close(s); + *noproto = 0; + *inuse = 0; + return -1; + } } # endif /* USE_WINSOCK */ # endif /* IPv6 MTU */ -- 2.39.5