summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChristian Heimes <christian@python.org>2022-03-11 22:25:14 (GMT)
committerGitHub <noreply@github.com>2022-03-11 22:25:14 (GMT)
commitecfff63e06e77e22035a7f7caa26986f033f3aea (patch)
tree956166c47566051afd5f2c18bdc56863bc2f477c
parent3b128c054885fe881c3b57a5978de3ea89c81a9c (diff)
downloadcpython-ecfff63e06e77e22035a7f7caa26986f033f3aea.zip
cpython-ecfff63e06e77e22035a7f7caa26986f033f3aea.tar.gz
cpython-ecfff63e06e77e22035a7f7caa26986f033f3aea.tar.bz2
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.
-rw-r--r--Lib/socketserver.py4
-rw-r--r--Modules/socketmodule.c2
-rw-r--r--Modules/socketmodule.h15
-rw-r--r--Tools/wasm/config.site-wasm32-emscripten6
4 files changed, 22 insertions, 5 deletions
diff --git a/Lib/socketserver.py b/Lib/socketserver.py
index 5e070bc..30a5cfa 100644
--- a/Lib/socketserver.py
+++ b/Lib/socketserver.py
@@ -465,9 +465,9 @@ class TCPServer(BaseServer):
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()
diff --git a/Modules/socketmodule.c b/Modules/socketmodule.c
index 3fca9f6..fbdd1a1 100644
--- a/Modules/socketmodule.c
+++ b/Modules/socketmodule.c
@@ -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
diff --git a/Modules/socketmodule.h b/Modules/socketmodule.h
index db26c04..1b35b11 100644
--- a/Modules/socketmodule.h
+++ b/Modules/socketmodule.h
@@ -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
diff --git a/Tools/wasm/config.site-wasm32-emscripten b/Tools/wasm/config.site-wasm32-emscripten
index 5eaa793..2a60198 100644
--- a/Tools/wasm/config.site-wasm32-emscripten
+++ b/Tools/wasm/config.site-wasm32-emscripten
@@ -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