diff options
author | Florian Weimer <fweimer@redhat.com> | 2017-11-23 10:00:40 +0100 |
---|---|---|
committer | Florian Weimer <fweimer@redhat.com> | 2017-11-23 10:00:40 +0100 |
commit | 59d2cbb1fe4b8601d5cbd359c3806973eab6c62d (patch) | |
tree | b0dc954009b8a65f9091d88e471db3476da7b2ad /sysdeps/unix | |
parent | 0a9d1d62b36cc46bf893ce404013a7b2d0bcfce8 (diff) | |
download | glibc-59d2cbb1fe4b8601d5cbd359c3806973eab6c62d.tar.gz |
Linux: Add memfd_create system call wrapper
The system call is somewhat obscure because it is closely related
to file descriptor sealing. However, it is also the recommended
way to create alias mappings, which is why it has more general use.
No emulation is provided. Except for the name of the
/proc/self/fd links, it would be possible to implement an
approximation using O_TMPFILE and tmpfs, but this does not appear
to be worth the added complexity.
Reviewed-by: Adhemerval Zanella <adhemerval.zanella@linaro.org>
Reviewed-by: Christian Brauner <christian.brauner@ubuntu.com>
Diffstat (limited to 'sysdeps/unix')
33 files changed, 170 insertions, 1 deletions
diff --git a/sysdeps/unix/sysv/linux/Makefile b/sysdeps/unix/sysv/linux/Makefile index c6675b3aa5..c484d2688a 100644 --- a/sysdeps/unix/sysv/linux/Makefile +++ b/sysdeps/unix/sysv/linux/Makefile @@ -44,7 +44,7 @@ sysdep_headers += sys/mount.h sys/acct.h sys/sysctl.h \ tests += tst-clone tst-clone2 tst-clone3 tst-fanotify tst-personality \ tst-quota tst-sync_file_range tst-sysconf-iov_max tst-ttyname \ - test-errno-linux + test-errno-linux tst-memfd_create # Generate the list of SYS_* macros for the system calls (__NR_* # macros). The file syscall-names.list contains all possible system diff --git a/sysdeps/unix/sysv/linux/Versions b/sysdeps/unix/sysv/linux/Versions index d3dbcde8c9..6f2fe516d7 100644 --- a/sysdeps/unix/sysv/linux/Versions +++ b/sysdeps/unix/sysv/linux/Versions @@ -166,6 +166,9 @@ libc { GLIBC_2.15 { process_vm_readv; process_vm_writev; } + GLIBC_2.27 { + memfd_create; + } GLIBC_PRIVATE { # functions used in other libraries __syscall_rt_sigqueueinfo; diff --git a/sysdeps/unix/sysv/linux/aarch64/libc.abilist b/sysdeps/unix/sysv/linux/aarch64/libc.abilist index ed598aedac..140ca28abc 100644 --- a/sysdeps/unix/sysv/linux/aarch64/libc.abilist +++ b/sysdeps/unix/sysv/linux/aarch64/libc.abilist @@ -2106,6 +2106,7 @@ GLIBC_2.26 reallocarray F GLIBC_2.27 GLIBC_2.27 A GLIBC_2.27 glob F GLIBC_2.27 glob64 F +GLIBC_2.27 memfd_create F GLIBC_2.27 strfromf128 F GLIBC_2.27 strtof128 F GLIBC_2.27 strtof128_l F diff --git a/sysdeps/unix/sysv/linux/alpha/libc.abilist b/sysdeps/unix/sysv/linux/alpha/libc.abilist index 4e57f36bcf..f698e1b2f4 100644 --- a/sysdeps/unix/sysv/linux/alpha/libc.abilist +++ b/sysdeps/unix/sysv/linux/alpha/libc.abilist @@ -2017,6 +2017,7 @@ GLIBC_2.26 reallocarray F GLIBC_2.27 GLIBC_2.27 A GLIBC_2.27 glob F GLIBC_2.27 glob64 F +GLIBC_2.27 memfd_create F GLIBC_2.27 strfromf128 F GLIBC_2.27 strtof128 F GLIBC_2.27 strtof128_l F diff --git a/sysdeps/unix/sysv/linux/arm/libc.abilist b/sysdeps/unix/sysv/linux/arm/libc.abilist index 5b70e1bfc9..8a8af3e3e4 100644 --- a/sysdeps/unix/sysv/linux/arm/libc.abilist +++ b/sysdeps/unix/sysv/linux/arm/libc.abilist @@ -107,6 +107,7 @@ GLIBC_2.26 reallocarray F GLIBC_2.27 GLIBC_2.27 A GLIBC_2.27 glob F GLIBC_2.27 glob64 F +GLIBC_2.27 memfd_create F GLIBC_2.4 GLIBC_2.4 A GLIBC_2.4 _Exit F GLIBC_2.4 _IO_2_1_stderr_ D 0xa0 diff --git a/sysdeps/unix/sysv/linux/bits/mman-linux.h b/sysdeps/unix/sysv/linux/bits/mman-linux.h index 78c07c890a..1ffa5490af 100644 --- a/sysdeps/unix/sysv/linux/bits/mman-linux.h +++ b/sysdeps/unix/sysv/linux/bits/mman-linux.h @@ -111,3 +111,19 @@ # define MCL_ONFAULT 4 /* Lock all pages that are faulted in. */ #endif + +#ifdef __USE_GNU +/* Flags for memfd_create. */ +# define MFD_CLOEXEC 1U +# define MFD_ALLOW_SEALING 2U +# define MFD_HUGETLB 4U + +__BEGIN_DECLS + +/* Create a new memory file descriptor. NAME is a name for debugging. + FLAGS is a combination of the MFD_* constants. */ +int memfd_create (const char *__name, unsigned int __flags) __THROW; + +__END_DECLS + +#endif /* __USE_GNU */ diff --git a/sysdeps/unix/sysv/linux/hppa/libc.abilist b/sysdeps/unix/sysv/linux/hppa/libc.abilist index 6a2500a8b3..5b81a6cd7d 100644 --- a/sysdeps/unix/sysv/linux/hppa/libc.abilist +++ b/sysdeps/unix/sysv/linux/hppa/libc.abilist @@ -1871,6 +1871,7 @@ GLIBC_2.26 reallocarray F GLIBC_2.27 GLIBC_2.27 A GLIBC_2.27 glob F GLIBC_2.27 glob64 F +GLIBC_2.27 memfd_create F GLIBC_2.3 GLIBC_2.3 A GLIBC_2.3 __ctype_b_loc F GLIBC_2.3 __ctype_tolower_loc F diff --git a/sysdeps/unix/sysv/linux/i386/libc.abilist b/sysdeps/unix/sysv/linux/i386/libc.abilist index 9ab4e3642a..51ead9e867 100644 --- a/sysdeps/unix/sysv/linux/i386/libc.abilist +++ b/sysdeps/unix/sysv/linux/i386/libc.abilist @@ -2036,6 +2036,7 @@ GLIBC_2.26 wcstof128_l F GLIBC_2.27 GLIBC_2.27 A GLIBC_2.27 glob F GLIBC_2.27 glob64 F +GLIBC_2.27 memfd_create F GLIBC_2.3 GLIBC_2.3 A GLIBC_2.3 __ctype_b_loc F GLIBC_2.3 __ctype_tolower_loc F diff --git a/sysdeps/unix/sysv/linux/ia64/libc.abilist b/sysdeps/unix/sysv/linux/ia64/libc.abilist index 81bb623fe8..78b4ee8d40 100644 --- a/sysdeps/unix/sysv/linux/ia64/libc.abilist +++ b/sysdeps/unix/sysv/linux/ia64/libc.abilist @@ -1900,6 +1900,7 @@ GLIBC_2.26 wcstof128_l F GLIBC_2.27 GLIBC_2.27 A GLIBC_2.27 glob F GLIBC_2.27 glob64 F +GLIBC_2.27 memfd_create F GLIBC_2.3 GLIBC_2.3 A GLIBC_2.3 __ctype_b_loc F GLIBC_2.3 __ctype_tolower_loc F diff --git a/sysdeps/unix/sysv/linux/m68k/coldfire/libc.abilist b/sysdeps/unix/sysv/linux/m68k/coldfire/libc.abilist index 5a33b57390..d9c97779e4 100644 --- a/sysdeps/unix/sysv/linux/m68k/coldfire/libc.abilist +++ b/sysdeps/unix/sysv/linux/m68k/coldfire/libc.abilist @@ -108,6 +108,7 @@ GLIBC_2.26 reallocarray F GLIBC_2.27 GLIBC_2.27 A GLIBC_2.27 glob F GLIBC_2.27 glob64 F +GLIBC_2.27 memfd_create F GLIBC_2.4 GLIBC_2.4 A GLIBC_2.4 _Exit F GLIBC_2.4 _IO_2_1_stderr_ D 0x98 diff --git a/sysdeps/unix/sysv/linux/m68k/m680x0/libc.abilist b/sysdeps/unix/sysv/linux/m68k/m680x0/libc.abilist index 50a86e74fa..4acbf7eeed 100644 --- a/sysdeps/unix/sysv/linux/m68k/m680x0/libc.abilist +++ b/sysdeps/unix/sysv/linux/m68k/m680x0/libc.abilist @@ -1985,6 +1985,7 @@ GLIBC_2.26 reallocarray F GLIBC_2.27 GLIBC_2.27 A GLIBC_2.27 glob F GLIBC_2.27 glob64 F +GLIBC_2.27 memfd_create F GLIBC_2.3 GLIBC_2.3 A GLIBC_2.3 __ctype_b_loc F GLIBC_2.3 __ctype_tolower_loc F diff --git a/sysdeps/unix/sysv/linux/microblaze/libc.abilist b/sysdeps/unix/sysv/linux/microblaze/libc.abilist index 250ef305c3..93f02f08ce 100644 --- a/sysdeps/unix/sysv/linux/microblaze/libc.abilist +++ b/sysdeps/unix/sysv/linux/microblaze/libc.abilist @@ -2106,3 +2106,4 @@ GLIBC_2.26 reallocarray F GLIBC_2.27 GLIBC_2.27 A GLIBC_2.27 glob F GLIBC_2.27 glob64 F +GLIBC_2.27 memfd_create F diff --git a/sysdeps/unix/sysv/linux/mips/mips32/fpu/libc.abilist b/sysdeps/unix/sysv/linux/mips/mips32/fpu/libc.abilist index 87a1dc4ad7..795e85de70 100644 --- a/sysdeps/unix/sysv/linux/mips/mips32/fpu/libc.abilist +++ b/sysdeps/unix/sysv/linux/mips/mips32/fpu/libc.abilist @@ -1960,6 +1960,7 @@ GLIBC_2.26 reallocarray F GLIBC_2.27 GLIBC_2.27 A GLIBC_2.27 glob F GLIBC_2.27 glob64 F +GLIBC_2.27 memfd_create F GLIBC_2.3 GLIBC_2.3 A GLIBC_2.3 __ctype_b_loc F GLIBC_2.3 __ctype_tolower_loc F diff --git a/sysdeps/unix/sysv/linux/mips/mips32/nofpu/libc.abilist b/sysdeps/unix/sysv/linux/mips/mips32/nofpu/libc.abilist index f2b35f250e..dc714057b7 100644 --- a/sysdeps/unix/sysv/linux/mips/mips32/nofpu/libc.abilist +++ b/sysdeps/unix/sysv/linux/mips/mips32/nofpu/libc.abilist @@ -1958,6 +1958,7 @@ GLIBC_2.26 reallocarray F GLIBC_2.27 GLIBC_2.27 A GLIBC_2.27 glob F GLIBC_2.27 glob64 F +GLIBC_2.27 memfd_create F GLIBC_2.3 GLIBC_2.3 A GLIBC_2.3 __ctype_b_loc F GLIBC_2.3 __ctype_tolower_loc F diff --git a/sysdeps/unix/sysv/linux/mips/mips64/n32/libc.abilist b/sysdeps/unix/sysv/linux/mips/mips64/n32/libc.abilist index ade654dbea..ce7bc9b175 100644 --- a/sysdeps/unix/sysv/linux/mips/mips64/n32/libc.abilist +++ b/sysdeps/unix/sysv/linux/mips/mips64/n32/libc.abilist @@ -1956,6 +1956,7 @@ GLIBC_2.26 reallocarray F GLIBC_2.27 GLIBC_2.27 A GLIBC_2.27 glob F GLIBC_2.27 glob64 F +GLIBC_2.27 memfd_create F GLIBC_2.27 strfromf128 F GLIBC_2.27 strtof128 F GLIBC_2.27 strtof128_l F diff --git a/sysdeps/unix/sysv/linux/mips/mips64/n64/libc.abilist b/sysdeps/unix/sysv/linux/mips/mips64/n64/libc.abilist index 56032c3f82..3fdd85eace 100644 --- a/sysdeps/unix/sysv/linux/mips/mips64/n64/libc.abilist +++ b/sysdeps/unix/sysv/linux/mips/mips64/n64/libc.abilist @@ -1951,6 +1951,7 @@ GLIBC_2.26 reallocarray F GLIBC_2.27 GLIBC_2.27 A GLIBC_2.27 glob F GLIBC_2.27 glob64 F +GLIBC_2.27 memfd_create F GLIBC_2.27 strfromf128 F GLIBC_2.27 strtof128 F GLIBC_2.27 strtof128_l F diff --git a/sysdeps/unix/sysv/linux/nios2/libc.abilist b/sysdeps/unix/sysv/linux/nios2/libc.abilist index c599dd9212..3e0bcb2a5c 100644 --- a/sysdeps/unix/sysv/linux/nios2/libc.abilist +++ b/sysdeps/unix/sysv/linux/nios2/libc.abilist @@ -2147,3 +2147,4 @@ GLIBC_2.26 reallocarray F GLIBC_2.27 GLIBC_2.27 A GLIBC_2.27 glob F GLIBC_2.27 glob64 F +GLIBC_2.27 memfd_create F diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc32/fpu/libc.abilist b/sysdeps/unix/sysv/linux/powerpc/powerpc32/fpu/libc.abilist index 385409aa6e..375c69d9d1 100644 --- a/sysdeps/unix/sysv/linux/powerpc/powerpc32/fpu/libc.abilist +++ b/sysdeps/unix/sysv/linux/powerpc/powerpc32/fpu/libc.abilist @@ -1989,6 +1989,7 @@ GLIBC_2.26 reallocarray F GLIBC_2.27 GLIBC_2.27 A GLIBC_2.27 glob F GLIBC_2.27 glob64 F +GLIBC_2.27 memfd_create F GLIBC_2.3 GLIBC_2.3 A GLIBC_2.3 __ctype_b_loc F GLIBC_2.3 __ctype_tolower_loc F diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/libc.abilist b/sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/libc.abilist index e99cb454b5..a88172a906 100644 --- a/sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/libc.abilist +++ b/sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/libc.abilist @@ -1994,6 +1994,7 @@ GLIBC_2.26 reallocarray F GLIBC_2.27 GLIBC_2.27 A GLIBC_2.27 glob F GLIBC_2.27 glob64 F +GLIBC_2.27 memfd_create F GLIBC_2.3 GLIBC_2.3 A GLIBC_2.3 __ctype_b_loc F GLIBC_2.3 __ctype_tolower_loc F diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc64/libc-le.abilist b/sysdeps/unix/sysv/linux/powerpc/powerpc64/libc-le.abilist index 173672ab5e..fa026a332c 100644 --- a/sysdeps/unix/sysv/linux/powerpc/powerpc64/libc-le.abilist +++ b/sysdeps/unix/sysv/linux/powerpc/powerpc64/libc-le.abilist @@ -2201,3 +2201,4 @@ GLIBC_2.26 wcstof128_l F GLIBC_2.27 GLIBC_2.27 A GLIBC_2.27 glob F GLIBC_2.27 glob64 F +GLIBC_2.27 memfd_create F diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc64/libc.abilist b/sysdeps/unix/sysv/linux/powerpc/powerpc64/libc.abilist index 8a654436ab..838f395d78 100644 --- a/sysdeps/unix/sysv/linux/powerpc/powerpc64/libc.abilist +++ b/sysdeps/unix/sysv/linux/powerpc/powerpc64/libc.abilist @@ -108,6 +108,7 @@ GLIBC_2.26 reallocarray F GLIBC_2.27 GLIBC_2.27 A GLIBC_2.27 glob F GLIBC_2.27 glob64 F +GLIBC_2.27 memfd_create F GLIBC_2.3 GLIBC_2.3 A GLIBC_2.3 _Exit F GLIBC_2.3 _IO_2_1_stderr_ D 0xe0 diff --git a/sysdeps/unix/sysv/linux/s390/s390-32/libc.abilist b/sysdeps/unix/sysv/linux/s390/s390-32/libc.abilist index dbd411ceb1..41b79c496a 100644 --- a/sysdeps/unix/sysv/linux/s390/s390-32/libc.abilist +++ b/sysdeps/unix/sysv/linux/s390/s390-32/libc.abilist @@ -1989,6 +1989,7 @@ GLIBC_2.26 reallocarray F GLIBC_2.27 GLIBC_2.27 A GLIBC_2.27 glob F GLIBC_2.27 glob64 F +GLIBC_2.27 memfd_create F GLIBC_2.27 strfromf128 F GLIBC_2.27 strtof128 F GLIBC_2.27 strtof128_l F diff --git a/sysdeps/unix/sysv/linux/s390/s390-64/libc.abilist b/sysdeps/unix/sysv/linux/s390/s390-64/libc.abilist index 5617784ca0..68251a0e69 100644 --- a/sysdeps/unix/sysv/linux/s390/s390-64/libc.abilist +++ b/sysdeps/unix/sysv/linux/s390/s390-64/libc.abilist @@ -1890,6 +1890,7 @@ GLIBC_2.26 reallocarray F GLIBC_2.27 GLIBC_2.27 A GLIBC_2.27 glob F GLIBC_2.27 glob64 F +GLIBC_2.27 memfd_create F GLIBC_2.27 strfromf128 F GLIBC_2.27 strtof128 F GLIBC_2.27 strtof128_l F diff --git a/sysdeps/unix/sysv/linux/sh/libc.abilist b/sysdeps/unix/sysv/linux/sh/libc.abilist index 0f840e6e88..bc1aae275e 100644 --- a/sysdeps/unix/sysv/linux/sh/libc.abilist +++ b/sysdeps/unix/sysv/linux/sh/libc.abilist @@ -1875,6 +1875,7 @@ GLIBC_2.26 reallocarray F GLIBC_2.27 GLIBC_2.27 A GLIBC_2.27 glob F GLIBC_2.27 glob64 F +GLIBC_2.27 memfd_create F GLIBC_2.3 GLIBC_2.3 A GLIBC_2.3 __ctype_b_loc F GLIBC_2.3 __ctype_tolower_loc F diff --git a/sysdeps/unix/sysv/linux/sparc/sparc32/libc.abilist b/sysdeps/unix/sysv/linux/sparc/sparc32/libc.abilist index bb7e1042c7..93e6d092ac 100644 --- a/sysdeps/unix/sysv/linux/sparc/sparc32/libc.abilist +++ b/sysdeps/unix/sysv/linux/sparc/sparc32/libc.abilist @@ -1982,6 +1982,7 @@ GLIBC_2.26 reallocarray F GLIBC_2.27 GLIBC_2.27 A GLIBC_2.27 glob F GLIBC_2.27 glob64 F +GLIBC_2.27 memfd_create F GLIBC_2.27 strfromf128 F GLIBC_2.27 strtof128 F GLIBC_2.27 strtof128_l F diff --git a/sysdeps/unix/sysv/linux/sparc/sparc64/libc.abilist b/sysdeps/unix/sysv/linux/sparc/sparc64/libc.abilist index 4053b0a51c..b11d6764d4 100644 --- a/sysdeps/unix/sysv/linux/sparc/sparc64/libc.abilist +++ b/sysdeps/unix/sysv/linux/sparc/sparc64/libc.abilist @@ -1919,6 +1919,7 @@ GLIBC_2.26 reallocarray F GLIBC_2.27 GLIBC_2.27 A GLIBC_2.27 glob F GLIBC_2.27 glob64 F +GLIBC_2.27 memfd_create F GLIBC_2.27 strfromf128 F GLIBC_2.27 strtof128 F GLIBC_2.27 strtof128_l F diff --git a/sysdeps/unix/sysv/linux/syscalls.list b/sysdeps/unix/sysv/linux/syscalls.list index 8bfb080d80..40c4fbb9ea 100644 --- a/sysdeps/unix/sysv/linux/syscalls.list +++ b/sysdeps/unix/sysv/linux/syscalls.list @@ -109,3 +109,4 @@ setns EXTRA setns i:ii setns process_vm_readv EXTRA process_vm_readv i:ipipii process_vm_readv process_vm_writev EXTRA process_vm_writev i:ipipii process_vm_writev +memfd_create EXTRA memfd_create i:si memfd_create diff --git a/sysdeps/unix/sysv/linux/tile/tilegx/tilegx32/libc.abilist b/sysdeps/unix/sysv/linux/tile/tilegx/tilegx32/libc.abilist index 38a96d3a02..e9eb4ff7bd 100644 --- a/sysdeps/unix/sysv/linux/tile/tilegx/tilegx32/libc.abilist +++ b/sysdeps/unix/sysv/linux/tile/tilegx/tilegx32/libc.abilist @@ -2113,3 +2113,4 @@ GLIBC_2.26 reallocarray F GLIBC_2.27 GLIBC_2.27 A GLIBC_2.27 glob F GLIBC_2.27 glob64 F +GLIBC_2.27 memfd_create F diff --git a/sysdeps/unix/sysv/linux/tile/tilegx/tilegx64/libc.abilist b/sysdeps/unix/sysv/linux/tile/tilegx/tilegx64/libc.abilist index 572b917d7d..8f08e909cd 100644 --- a/sysdeps/unix/sysv/linux/tile/tilegx/tilegx64/libc.abilist +++ b/sysdeps/unix/sysv/linux/tile/tilegx/tilegx64/libc.abilist @@ -2113,3 +2113,4 @@ GLIBC_2.26 reallocarray F GLIBC_2.27 GLIBC_2.27 A GLIBC_2.27 glob F GLIBC_2.27 glob64 F +GLIBC_2.27 memfd_create F diff --git a/sysdeps/unix/sysv/linux/tile/tilepro/libc.abilist b/sysdeps/unix/sysv/linux/tile/tilepro/libc.abilist index 38a96d3a02..e9eb4ff7bd 100644 --- a/sysdeps/unix/sysv/linux/tile/tilepro/libc.abilist +++ b/sysdeps/unix/sysv/linux/tile/tilepro/libc.abilist @@ -2113,3 +2113,4 @@ GLIBC_2.26 reallocarray F GLIBC_2.27 GLIBC_2.27 A GLIBC_2.27 glob F GLIBC_2.27 glob64 F +GLIBC_2.27 memfd_create F diff --git a/sysdeps/unix/sysv/linux/tst-memfd_create.c b/sysdeps/unix/sysv/linux/tst-memfd_create.c new file mode 100644 index 0000000000..fd173ff71d --- /dev/null +++ b/sysdeps/unix/sysv/linux/tst-memfd_create.c @@ -0,0 +1,121 @@ +/* Test for the memfd_create system call. + Copyright (C) 2017 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + <http://www.gnu.org/licenses/>. */ + +#include <errno.h> +#include <fcntl.h> +#include <stdbool.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <support/check.h> +#include <support/support.h> +#include <support/test-driver.h> +#include <support/xunistd.h> +#include <sys/mman.h> + +/* Return true if the descriptor has the FD_CLOEXEC flag set. */ +static bool +is_cloexec (int fd) +{ + int flags = fcntl (fd, F_GETFD); + TEST_VERIFY (flags >= 0); + return flags & FD_CLOEXEC; +} + +/* Return the seals set on FD. */ +static int +get_seals (int fd) +{ + int flags = fcntl (fd, F_GET_SEALS); + TEST_VERIFY (flags >= 0); + return flags; +} + +/* Return true if the F_SEAL_SEAL flag is set on the descriptor. */ +static bool +is_sealed (int fd) +{ + return get_seals (fd) & F_SEAL_SEAL; +} + +static int +do_test (void) +{ + /* Initialized by the first call to memfd_create to 0 (memfd_create + unsupported) or 1 (memfd_create is implemented in the kernel). + Subsequent iterations check that the success/failure state is + consistent. */ + int supported = -1; + + for (int do_cloexec = 0; do_cloexec < 2; ++do_cloexec) + for (int do_sealing = 0; do_sealing < 2; ++do_sealing) + { + int flags = 0; + if (do_cloexec) + flags |= MFD_CLOEXEC; + if (do_sealing) + flags |= MFD_ALLOW_SEALING; + if (test_verbose > 0) + printf ("info: memfd_create with flags=0x%x\n", flags); + int fd = memfd_create ("tst-memfd_create", flags); + if (fd < 0) + { + if (errno == ENOSYS) + { + if (supported < 0) + { + printf ("warning: memfd_create is unsupported\n"); + supported = 0; + continue; + } + TEST_VERIFY (supported == 0); + continue; + } + else + FAIL_EXIT1 ("memfd_create: %m"); + } + if (supported < 0) + supported = 1; + TEST_VERIFY (supported > 0); + + char *fd_path = xasprintf ("/proc/self/fd/%d", fd); + char *link = xreadlink (fd_path); + if (test_verbose > 0) + printf ("info: memfd link: %s\n", link); + TEST_VERIFY (strcmp (link, "memfd:tst-memfd_create (deleted)")); + TEST_VERIFY (is_cloexec (fd) == do_cloexec); + TEST_VERIFY (is_sealed (fd) == !do_sealing); + if (do_sealing) + { + TEST_VERIFY (fcntl (fd, F_ADD_SEALS, F_SEAL_WRITE) == 0); + TEST_VERIFY (!is_sealed (fd)); + TEST_VERIFY (get_seals (fd) & F_SEAL_WRITE); + TEST_VERIFY (fcntl (fd, F_ADD_SEALS, F_SEAL_SEAL) == 0); + TEST_VERIFY (is_sealed (fd)); + } + xclose (fd); + free (fd_path); + free (link); + } + + if (supported == 0) + return EXIT_UNSUPPORTED; + return 0; +} + +#include <support/test-driver.c> diff --git a/sysdeps/unix/sysv/linux/x86_64/64/libc.abilist b/sysdeps/unix/sysv/linux/x86_64/64/libc.abilist index b83d25c2e3..0a4f7797ac 100644 --- a/sysdeps/unix/sysv/linux/x86_64/64/libc.abilist +++ b/sysdeps/unix/sysv/linux/x86_64/64/libc.abilist @@ -1877,6 +1877,7 @@ GLIBC_2.26 wcstof128_l F GLIBC_2.27 GLIBC_2.27 A GLIBC_2.27 glob F GLIBC_2.27 glob64 F +GLIBC_2.27 memfd_create F GLIBC_2.3 GLIBC_2.3 A GLIBC_2.3 __ctype_b_loc F GLIBC_2.3 __ctype_tolower_loc F diff --git a/sysdeps/unix/sysv/linux/x86_64/x32/libc.abilist b/sysdeps/unix/sysv/linux/x86_64/x32/libc.abilist index cba1d59057..23f6a91429 100644 --- a/sysdeps/unix/sysv/linux/x86_64/x32/libc.abilist +++ b/sysdeps/unix/sysv/linux/x86_64/x32/libc.abilist @@ -2120,3 +2120,4 @@ GLIBC_2.26 wcstof128_l F GLIBC_2.27 GLIBC_2.27 A GLIBC_2.27 glob F GLIBC_2.27 glob64 F +GLIBC_2.27 memfd_create F |