]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
[3.11] gh-95174: Handle missing dup() and constants in WASI (GH-95229) (GH-95272)
authorChristian Heimes <christian@python.org>
Sun, 31 Jul 2022 15:39:41 +0000 (17:39 +0200)
committerGitHub <noreply@github.com>
Sun, 31 Jul 2022 15:39:41 +0000 (16:39 +0100)
Co-authored-by: Christian Heimes <christian@python.org>
12 files changed:
Misc/NEWS.d/next/Build/2022-07-25-08-59-35.gh-issue-95174.g8woUW.rst [new file with mode: 0644]
Modules/clinic/posixmodule.c.h
Modules/errnomodule.c
Modules/posixmodule.c
Modules/selectmodule.c
Modules/socketmodule.c
PC/pyconfig.h
Python/dup2.c
Python/fileutils.c
configure
configure.ac
pyconfig.h.in

diff --git a/Misc/NEWS.d/next/Build/2022-07-25-08-59-35.gh-issue-95174.g8woUW.rst b/Misc/NEWS.d/next/Build/2022-07-25-08-59-35.gh-issue-95174.g8woUW.rst
new file mode 100644 (file)
index 0000000..05f2995
--- /dev/null
@@ -0,0 +1,2 @@
+Python now detects missing ``dup`` function in WASI and works around some
+missing :mod:`errno`, :mod:`select`, and :mod:`socket` constants.
index aaf3bf33b53527fddbdc65eca01892ac00d0e266..ca2699b4e366a3d1b1374c746f910aba0d031d92 100644 (file)
@@ -4691,6 +4691,8 @@ exit:
     return return_value;
 }
 
+#if ((defined(HAVE_DUP3) || defined(F_DUPFD) || defined(MS_WINDOWS)))
+
 PyDoc_STRVAR(os_dup2__doc__,
 "dup2($module, /, fd, fd2, inheritable=True)\n"
 "--\n"
@@ -4746,6 +4748,8 @@ exit:
     return return_value;
 }
 
+#endif /* ((defined(HAVE_DUP3) || defined(F_DUPFD) || defined(MS_WINDOWS))) */
+
 #if defined(HAVE_LOCKF)
 
 PyDoc_STRVAR(os_lockf__doc__,
@@ -9123,6 +9127,10 @@ exit:
     #define OS_TCSETPGRP_METHODDEF
 #endif /* !defined(OS_TCSETPGRP_METHODDEF) */
 
+#ifndef OS_DUP2_METHODDEF
+    #define OS_DUP2_METHODDEF
+#endif /* !defined(OS_DUP2_METHODDEF) */
+
 #ifndef OS_LOCKF_METHODDEF
     #define OS_LOCKF_METHODDEF
 #endif /* !defined(OS_LOCKF_METHODDEF) */
@@ -9370,4 +9378,4 @@ exit:
 #ifndef OS_WAITSTATUS_TO_EXITCODE_METHODDEF
     #define OS_WAITSTATUS_TO_EXITCODE_METHODDEF
 #endif /* !defined(OS_WAITSTATUS_TO_EXITCODE_METHODDEF) */
-/*[clinic end generated code: output=2a53748bcf001a3f input=a9049054013a1b77]*/
+/*[clinic end generated code: output=3032d9c5c3aaa165 input=a9049054013a1b77]*/
index bf6766e02349c0037beb4db84c3ab5a02da20735..0516e7367050c2f187ccf928a74233c61c7ccefd 100644 (file)
@@ -280,6 +280,10 @@ errno_exec(PyObject *module)
 #ifdef ENOANO
     add_errcode("ENOANO", ENOANO, "No anode");
 #endif
+#if defined(__wasi__) && !defined(ESHUTDOWN)
+    // WASI SDK 16 does not have ESHUTDOWN, shutdown results in EPIPE.
+    #define ESHUTDOWN EPIPE
+#endif
 #ifdef ESHUTDOWN
     add_errcode("ESHUTDOWN", ESHUTDOWN, "Cannot send after transport endpoint shutdown");
 #else
index f97013fa7a9d0d92cb265f58612b6b82cd3889b5..378032501f9e8793265e2bd39b0b934fd2dfe98d 100644 (file)
@@ -9346,7 +9346,9 @@ os_dup_impl(PyObject *module, int fd)
     return _Py_dup(fd);
 }
 
-
+// dup2() is either provided by libc or dup2.c with AC_REPLACE_FUNCS().
+// dup2.c provides working dup2() if and only if F_DUPFD is available.
+#if (defined(HAVE_DUP3) || defined(F_DUPFD) || defined(MS_WINDOWS))
 /*[clinic input]
 os.dup2 -> int
     fd: int
@@ -9446,6 +9448,7 @@ os_dup2_impl(PyObject *module, int fd, int fd2, int inheritable)
 
     return res;
 }
+#endif
 
 
 #ifdef HAVE_LOCKF
index 5c36eaaedeb70b2d62da4e4c42b12cdc503fb85c..4eea928a2683ae6444004317188bc960b808ede2 100644 (file)
@@ -63,6 +63,11 @@ extern void bzero(void *, int);
 #  define SOCKET int
 #endif
 
+// WASI SDK 16 does not have POLLPRIO, define as no-op
+#if defined(__wasi__) && !defined(POLLPRI)
+#  define POLLPRI 0
+#endif
+
 typedef struct {
     PyObject *close;
     PyTypeObject *poll_Type;
index 4e936e29a7cd91db7929da68e6746ac552e217d2..7240739c7b3ba2e583dbf6c8d2531f6c0b40ae34 100644 (file)
@@ -7650,6 +7650,10 @@ PyInit__socket(void)
     PyModule_AddIntMacro(m, MSG_EOR);
 #endif
 #ifdef  MSG_TRUNC
+    // workaround for https://github.com/WebAssembly/wasi-libc/issues/305
+    #if defined(__wasi__) && !defined(__WASI_RIFLAGS_RECV_DATA_TRUNCATED)
+    #  define __WASI_RIFLAGS_RECV_DATA_TRUNCATED 2
+    #endif
     PyModule_AddIntMacro(m, MSG_TRUNC);
 #endif
 #ifdef  MSG_CTRUNC
index f71d5fe00d575dcb0f6055800c96db92e1201308..f1673a168ffb35eef78522db42f5b7e59b502cda 100644 (file)
@@ -681,6 +681,9 @@ Py_NO_ENABLE_SHARED to find out.  Also support MS_NO_COREDLL for b/w compat */
 /* Define if you have the 'inet_pton' function. */
 #define HAVE_INET_PTON 1
 
+/* Define to 1 if you have the `dup' function. */
+#define HAVE_DUP 1
+
 /* framework name */
 #define _PYTHONFRAMEWORK ""
 
index 7c6bbfce11dbf80dae7fe4c79d4c52839a0c68ad..a1df0492099163982661b996e697c708c0235783 100644 (file)
@@ -11,6 +11,7 @@
  * Return fd2 if all went well; return BADEXIT otherwise.
  */
 
+#include <errno.h>
 #include <fcntl.h>
 #include <unistd.h>
 
@@ -20,12 +21,17 @@ int
 dup2(int fd1, int fd2)
 {
     if (fd1 != fd2) {
+#ifdef F_DUPFD
         if (fcntl(fd1, F_GETFL) < 0)
             return BADEXIT;
         if (fcntl(fd2, F_GETFL) >= 0)
             close(fd2);
         if (fcntl(fd1, F_DUPFD, fd2) < 0)
             return BADEXIT;
+#else
+        errno = ENOTSUP;
+        return BADEXIT;
+#endif
     }
     return fd2;
 }
index 4f7f8944a72da5ccc060ebce81891e0f91d1bfb8..27924261f439619a572969ab56efea13bbb75504 100644 (file)
@@ -2379,7 +2379,7 @@ _Py_dup(int fd)
         return -1;
     }
 
-#else
+#elif HAVE_DUP
     Py_BEGIN_ALLOW_THREADS
     _Py_BEGIN_SUPPRESS_IPH
     fd = dup(fd);
@@ -2396,6 +2396,10 @@ _Py_dup(int fd)
         _Py_END_SUPPRESS_IPH
         return -1;
     }
+#else
+    errno = ENOTSUP;
+    PyErr_SetFromErrno(PyExc_OSError);
+    return -1;
 #endif
     return fd;
 }
index 19316baa6ee128895b2e1cf41e565dd5fc6e8873..39f7cd8eaec0ab6fd0d564e14d42e1a93f8cd236 100755 (executable)
--- a/configure
+++ b/configure
@@ -14953,7 +14953,7 @@ fi
 # checks for library functions
 for ac_func in  \
   accept4 alarm bind_textdomain_codeset chmod chown clock close_range confstr \
-  copy_file_range ctermid dup3 execv explicit_bzero explicit_memset \
+  copy_file_range ctermid dup dup3 execv explicit_bzero explicit_memset \
   faccessat fchmod fchmodat fchown fchownat fdopendir fdwalk fexecve \
   fork fork1 fpathconf fstatat ftime ftruncate futimens futimes futimesat \
   gai_strerror getegid getentropy geteuid getgid getgrgid getgrgid_r \
index f1fa570556235a82d04f72c1328256eb9b01a0cf..60daab58d24b8dc599b19355e860ef4fd8f2613a 100644 (file)
@@ -4537,7 +4537,7 @@ fi
 # checks for library functions
 AC_CHECK_FUNCS([ \
   accept4 alarm bind_textdomain_codeset chmod chown clock close_range confstr \
-  copy_file_range ctermid dup3 execv explicit_bzero explicit_memset \
+  copy_file_range ctermid dup dup3 execv explicit_bzero explicit_memset \
   faccessat fchmod fchmodat fchown fchownat fdopendir fdwalk fexecve \
   fork fork1 fpathconf fstatat ftime ftruncate futimens futimes futimesat \
   gai_strerror getegid getentropy geteuid getgid getgrgid getgrgid_r \
index 01928cbb33ad525cc502e464bcbbdbde73b8c9b8..4aaa32c8b433638b8e3d7f7567b8abf0325f3565 100644 (file)
 /* Define to 1 if you have the `dlopen' function. */
 #undef HAVE_DLOPEN
 
+/* Define to 1 if you have the `dup' function. */
+#undef HAVE_DUP
+
 /* Define to 1 if you have the `dup2' function. */
 #undef HAVE_DUP2