bpo-26836: Add os.memfd_create() (#13567)

* bpo-26836: Add os.memfd_create()

* Use the glibc wrapper for memfd_create()

Co-Authored-By: Christian Heimes <christian@python.org>

* Fix deletions caused by autoreconf.

* Use MFD_CLOEXEC as the default value for *flags*.

* Add memset_s to configure.ac.

* Revert memset_s changes.

* Apply the requested changes.

* Tweak the docs.
This commit is contained in:
Zackery Spytz 2019-05-29 13:57:07 -06:00 committed by Christian Heimes
parent 0c2f930564
commit 43fdbd2729
10 changed files with 259 additions and 12 deletions

View file

@ -389,6 +389,19 @@ extern char *ctermid_r(char *);
#define HAVE_STRUCT_STAT_ST_FSTYPE 1
#endif
/* memfd_create is either defined in sys/mman.h or sys/memfd.h
* linux/memfd.h defines additional flags
*/
#ifdef HAVE_SYS_MMAN_H
#include <sys/mman.h>
#endif
#ifdef HAVE_SYS_MEMFD_H
#include <sys/memfd.h>
#endif
#ifdef HAVE_LINUX_MEMFD_H
#include <linux/memfd.h>
#endif
#ifdef _Py_MEMORY_SANITIZER
# include <sanitizer/msan_interface.h>
#endif
@ -11897,6 +11910,31 @@ os_urandom_impl(PyObject *module, Py_ssize_t size)
return bytes;
}
#ifdef HAVE_MEMFD_CREATE
/*[clinic input]
os.memfd_create
name: FSConverter
flags: unsigned_int(bitwise=True, c_default="MFD_CLOEXEC") = MFD_CLOEXEC
[clinic start generated code]*/
static PyObject *
os_memfd_create_impl(PyObject *module, PyObject *name, unsigned int flags)
/*[clinic end generated code: output=6681ede983bdb9a6 input=a42cfc199bcd56e9]*/
{
int fd;
const char *bytes = PyBytes_AS_STRING(name);
Py_BEGIN_ALLOW_THREADS
fd = memfd_create(bytes, flags);
Py_END_ALLOW_THREADS
if (fd == -1) {
return PyErr_SetFromErrno(PyExc_OSError);
}
return PyLong_FromLong(fd);
}
#endif
/* Terminal size querying */
static PyTypeObject* TerminalSizeType;
@ -13554,6 +13592,7 @@ static PyMethodDef posix_methods[] = {
OS_SCANDIR_METHODDEF
OS_FSPATH_METHODDEF
OS_GETRANDOM_METHODDEF
OS_MEMFD_CREATE_METHODDEF
#ifdef MS_WINDOWS
OS__ADD_DLL_DIRECTORY_METHODDEF
OS__REMOVE_DLL_DIRECTORY_METHODDEF
@ -14003,6 +14042,27 @@ all_ins(PyObject *m)
if (PyModule_AddIntMacro(m, GRND_RANDOM)) return -1;
if (PyModule_AddIntMacro(m, GRND_NONBLOCK)) return -1;
#endif
#ifdef HAVE_MEMFD_CREATE
if (PyModule_AddIntMacro(m, MFD_CLOEXEC)) return -1;
if (PyModule_AddIntMacro(m, MFD_ALLOW_SEALING)) return -1;
#ifdef MFD_HUGETLB
if (PyModule_AddIntMacro(m, MFD_HUGETLB)) return -1;
if (PyModule_AddIntMacro(m, MFD_HUGE_SHIFT)) return -1;
if (PyModule_AddIntMacro(m, MFD_HUGE_MASK)) return -1;
if (PyModule_AddIntMacro(m, MFD_HUGE_64KB)) return -1;
if (PyModule_AddIntMacro(m, MFD_HUGE_512KB)) return -1;
if (PyModule_AddIntMacro(m, MFD_HUGE_1MB)) return -1;
if (PyModule_AddIntMacro(m, MFD_HUGE_2MB)) return -1;
if (PyModule_AddIntMacro(m, MFD_HUGE_8MB)) return -1;
if (PyModule_AddIntMacro(m, MFD_HUGE_16MB)) return -1;
if (PyModule_AddIntMacro(m, MFD_HUGE_32MB)) return -1;
if (PyModule_AddIntMacro(m, MFD_HUGE_256MB)) return -1;
if (PyModule_AddIntMacro(m, MFD_HUGE_512MB)) return -1;
if (PyModule_AddIntMacro(m, MFD_HUGE_1GB)) return -1;
if (PyModule_AddIntMacro(m, MFD_HUGE_2GB)) return -1;
if (PyModule_AddIntMacro(m, MFD_HUGE_16GB)) return -1;
#endif
#endif
#if defined(__APPLE__)
if (PyModule_AddIntConstant(m, "_COPYFILE_DATA", COPYFILE_DATA)) return -1;
@ -14119,6 +14179,10 @@ static const char * const have_functions[] = {
"HAVE_LUTIMES",
#endif
#ifdef HAVE_MEMFD_CREATE
"HAVE_MEMFD_CREATE",
#endif
#ifdef HAVE_MKDIRAT
"HAVE_MKDIRAT",
#endif