bpo-40280: Disable AF_UNIX, AF_PACKET, SO_REUSE* on Emscripten (#31829)

Emscripten's socket emulation is limited. AF_UNIX, AF_PACKET, setsockopt(), and most SO_* constants are not supported.
This commit is contained in:
Christian Heimes 2022-03-12 00:25:14 +02:00 committed by GitHub
parent 3b128c0548
commit ecfff63e06
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
4 changed files with 22 additions and 5 deletions

View file

@ -465,9 +465,9 @@ def server_bind(self):
May be overridden.
"""
if self.allow_reuse_address:
if self.allow_reuse_address and hasattr(socket, "SO_REUSEADDR"):
self.socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
if self.allow_reuse_port:
if self.allow_reuse_port and hasattr(socket, "SO_REUSEPORT"):
self.socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT, 1)
self.socket.bind(self.server_address)
self.server_address = self.socket.getsockname()

View file

@ -7933,7 +7933,7 @@ PyInit__socket(void)
#ifdef IPPROTO_VRRP
PyModule_AddIntMacro(m, IPPROTO_VRRP);
#endif
#if defined(IPPROTO_SCTP) && !defined(__EMSCRIPTEN__)
#ifdef IPPROTO_SCTP
PyModule_AddIntMacro(m, IPPROTO_SCTP);
#endif
#ifdef IPPROTO_BIP

View file

@ -192,6 +192,21 @@ typedef int socklen_t;
#endif /* HAVE_SOCKADDR_ALG */
#ifdef __EMSCRIPTEN__
// wasm32-emscripten sockets only support subset of IPv4 and IPv6.
// SCTP protocol crashes runtime.
#ifdef IPPROTO_SCTP
# undef IPPROTO_SCTP
#endif
// setsockopt() fails with ENOPROTOOPT, getsockopt only supports SO_ERROR.
// undef SO_REUSEADDR and SO_REUSEPORT so they cannot be used.
#ifdef SO_REUSEADDR
# undef SO_REUSEADDR
#endif
#ifdef SO_REUSEPORT
# undef SO_REUSEPORT
#endif
#endif // __EMSCRIPTEN__
#ifndef Py__SOCKET_H
#define Py__SOCKET_H

View file

@ -74,8 +74,10 @@ ac_cv_func_posix_fallocate=no
ac_cv_func_utimensat=no
ac_cv_header_sys_ioctl_h=no
# sockets are supported, but only in non-blocking mode
# ac_cv_header_sys_socket_h=no
# sockets are supported, but only AF_INET / AF_INET6 in non-blocking mode.
# Disable AF_UNIX and AF_PACKET support, see socketmodule.h.
ac_cv_header_sys_un_h=no
ac_cv_header_netpacket_packet_h=no
# aborts with bad ioctl
ac_cv_func_openpty=no