2020-11-09 05:23:58 +01:00
|
|
|
/* SPDX-License-Identifier: LGPL-2.1-or-later */
|
2016-03-17 18:26:13 +01:00
|
|
|
#pragma once
|
|
|
|
|
|
|
|
/* Missing glibc definitions to access certain kernel APIs */
|
|
|
|
|
2019-01-11 17:24:21 +01:00
|
|
|
#include <errno.h>
|
2018-12-04 08:26:09 +01:00
|
|
|
#include <fcntl.h>
|
2019-10-25 16:06:06 +02:00
|
|
|
#include <signal.h>
|
2018-12-04 08:26:09 +01:00
|
|
|
#include <sys/syscall.h>
|
2016-10-18 17:57:10 +02:00
|
|
|
#include <sys/types.h>
|
2019-10-25 16:06:06 +02:00
|
|
|
#include <sys/wait.h>
|
2018-12-06 06:32:41 +01:00
|
|
|
#include <unistd.h>
|
|
|
|
|
|
|
|
#ifdef ARCH_MIPS
|
|
|
|
#include <asm/sgidefs.h>
|
|
|
|
#endif
|
2016-10-18 17:57:10 +02:00
|
|
|
|
2020-12-07 05:32:04 +01:00
|
|
|
#if defined(__alpha__)
|
|
|
|
# define systemd_SC_arch_bias(x) (110 + (x))
|
2020-11-13 06:58:49 +01:00
|
|
|
#elif defined(__ia64__)
|
|
|
|
# define systemd_SC_arch_bias(x) (1024 + (x))
|
2020-12-07 05:32:04 +01:00
|
|
|
#elif defined(_MIPS_SIM)
|
2020-11-13 06:58:49 +01:00
|
|
|
# if _MIPS_SIM == _MIPS_SIM_ABI32
|
|
|
|
# define systemd_SC_arch_bias(x) (4000 + (x))
|
|
|
|
# elif _MIPS_SIM == _MIPS_SIM_NABI32
|
|
|
|
# define systemd_SC_arch_bias(x) (6000 + (x))
|
|
|
|
# elif _MIPS_SIM == _MIPS_SIM_ABI64
|
|
|
|
# define systemd_SC_arch_bias(x) (5000 + (x))
|
|
|
|
# else
|
|
|
|
# error "Unknown MIPS ABI"
|
|
|
|
# endif
|
2020-12-07 05:32:04 +01:00
|
|
|
#elif defined(__x86_64__) && defined(__ILP32__)
|
|
|
|
# define systemd_SC_arch_bias(x) ((x) | /* __X32_SYSCALL_BIT */ 0x40000000)
|
2020-10-09 08:56:57 +02:00
|
|
|
#else
|
2020-11-13 06:58:49 +01:00
|
|
|
# define systemd_SC_arch_bias(x) (x)
|
2020-10-09 08:56:57 +02:00
|
|
|
#endif
|
|
|
|
|
2018-12-04 07:41:15 +01:00
|
|
|
#include "missing_keyctl.h"
|
2018-12-04 07:56:19 +01:00
|
|
|
#include "missing_stat.h"
|
2018-12-04 07:41:15 +01:00
|
|
|
|
2018-12-06 06:32:41 +01:00
|
|
|
/* linux/kcmp.h */
|
|
|
|
#ifndef KCMP_FILE /* 3f4994cfc15f38a3159c6e3a4b3ab2e1481a6b02 (3.19) */
|
|
|
|
#define KCMP_FILE 0
|
|
|
|
#endif
|
|
|
|
|
2017-10-03 10:32:34 +02:00
|
|
|
#if !HAVE_PIVOT_ROOT
|
missing_syscall: when adding syscall replacements, use different names (#8229)
In meson.build we check that functions are available using:
meson.get_compiler('c').has_function('foo')
which checks the following:
- if __stub_foo or __stub___foo are defined, return false
- if foo is declared (a pointer to the function can be taken), return true
- otherwise check for __builtin_memfd_create
_stub is documented by glibc as
It defines a symbol '__stub_FUNCTION' for each function
in the C library which is a stub, meaning it will fail
every time called, usually setting errno to ENOSYS.
So if __stub is defined, we know we don't want to use the glibc version, but
this doesn't tell us if the name itself is defined or not. If it _is_ defined,
and we define our replacement as an inline static function, we get an error:
In file included from ../src/basic/missing.h:1358:0,
from ../src/basic/util.h:47,
from ../src/basic/calendarspec.h:29,
from ../src/basic/calendarspec.c:34:
../src/basic/missing_syscall.h:65:19: error: static declaration of 'memfd_create' follows non-static declaration
static inline int memfd_create(const char *name, unsigned int flags) {
^~~~~~~~~~~~
.../usr/include/bits/mman-shared.h:46:5: note: previous declaration of 'memfd_create' was here
int memfd_create (const char *__name, unsigned int __flags) __THROW;
^~~~~~~~~~~~
To avoid this problem, call our inline functions different than glibc,
and use a #define to map the official name to our replacement.
Fixes #8099.
v2:
- use "missing_" as the prefix instead of "_"
v3:
- rebase and update for statx()
Unfortunately "statx" is also present in "struct statx", so the define
causes issues. Work around this by using a typedef.
I checked that systemd compiles with current glibc
(glibc-devel-2.26-24.fc27.x86_64) if HAVE_MEMFD_CREATE, HAVE_GETTID,
HAVE_PIVOT_ROOT, HAVE_SETNS, HAVE_RENAMEAT2, HAVE_KCMP, HAVE_KEYCTL,
HAVE_COPY_FILE_RANGE, HAVE_BPF, HAVE_STATX are forced to 0.
Setting HAVE_NAME_TO_HANDLE_AT to 0 causes an issue, but it's not because of
the define, but because of struct file_handle.
2018-02-21 14:04:50 +01:00
|
|
|
static inline int missing_pivot_root(const char *new_root, const char *put_old) {
|
2018-02-21 17:27:34 +01:00
|
|
|
return syscall(__NR_pivot_root, new_root, put_old);
|
2016-03-17 18:26:13 +01:00
|
|
|
}
|
missing_syscall: when adding syscall replacements, use different names (#8229)
In meson.build we check that functions are available using:
meson.get_compiler('c').has_function('foo')
which checks the following:
- if __stub_foo or __stub___foo are defined, return false
- if foo is declared (a pointer to the function can be taken), return true
- otherwise check for __builtin_memfd_create
_stub is documented by glibc as
It defines a symbol '__stub_FUNCTION' for each function
in the C library which is a stub, meaning it will fail
every time called, usually setting errno to ENOSYS.
So if __stub is defined, we know we don't want to use the glibc version, but
this doesn't tell us if the name itself is defined or not. If it _is_ defined,
and we define our replacement as an inline static function, we get an error:
In file included from ../src/basic/missing.h:1358:0,
from ../src/basic/util.h:47,
from ../src/basic/calendarspec.h:29,
from ../src/basic/calendarspec.c:34:
../src/basic/missing_syscall.h:65:19: error: static declaration of 'memfd_create' follows non-static declaration
static inline int memfd_create(const char *name, unsigned int flags) {
^~~~~~~~~~~~
.../usr/include/bits/mman-shared.h:46:5: note: previous declaration of 'memfd_create' was here
int memfd_create (const char *__name, unsigned int __flags) __THROW;
^~~~~~~~~~~~
To avoid this problem, call our inline functions different than glibc,
and use a #define to map the official name to our replacement.
Fixes #8099.
v2:
- use "missing_" as the prefix instead of "_"
v3:
- rebase and update for statx()
Unfortunately "statx" is also present in "struct statx", so the define
causes issues. Work around this by using a typedef.
I checked that systemd compiles with current glibc
(glibc-devel-2.26-24.fc27.x86_64) if HAVE_MEMFD_CREATE, HAVE_GETTID,
HAVE_PIVOT_ROOT, HAVE_SETNS, HAVE_RENAMEAT2, HAVE_KCMP, HAVE_KEYCTL,
HAVE_COPY_FILE_RANGE, HAVE_BPF, HAVE_STATX are forced to 0.
Setting HAVE_NAME_TO_HANDLE_AT to 0 causes an issue, but it's not because of
the define, but because of struct file_handle.
2018-02-21 14:04:50 +01:00
|
|
|
|
|
|
|
# define pivot_root missing_pivot_root
|
2016-03-17 18:26:13 +01:00
|
|
|
#endif
|
|
|
|
|
|
|
|
/* ======================================================================= */
|
|
|
|
|
2020-12-07 05:32:04 +01:00
|
|
|
#if defined(__aarch64__)
|
2020-08-18 09:22:20 +02:00
|
|
|
# define systemd_NR_memfd_create 279
|
2020-12-07 05:32:04 +01:00
|
|
|
#elif defined(__alpha__)
|
2020-12-07 00:45:49 +01:00
|
|
|
# define systemd_NR_memfd_create 512
|
2020-12-08 06:59:45 +01:00
|
|
|
#elif defined(__arc__) || defined(__tilegx__)
|
2020-12-07 05:32:04 +01:00
|
|
|
# define systemd_NR_memfd_create 279
|
|
|
|
#elif defined(__arm__)
|
|
|
|
# define systemd_NR_memfd_create 385
|
|
|
|
#elif defined(__i386__)
|
|
|
|
# define systemd_NR_memfd_create 356
|
2020-12-08 06:59:45 +01:00
|
|
|
#elif defined(__ia64__)
|
|
|
|
# define systemd_NR_memfd_create systemd_SC_arch_bias(316)
|
|
|
|
#elif defined(__m68k__)
|
|
|
|
# define systemd_NR_memfd_create 353
|
2020-12-07 05:32:04 +01:00
|
|
|
#elif defined(_MIPS_SIM)
|
2020-08-18 09:22:20 +02:00
|
|
|
# if _MIPS_SIM == _MIPS_SIM_ABI32
|
2020-11-13 06:58:49 +01:00
|
|
|
# define systemd_NR_memfd_create systemd_SC_arch_bias(354)
|
|
|
|
# elif _MIPS_SIM == _MIPS_SIM_NABI32
|
|
|
|
# define systemd_NR_memfd_create systemd_SC_arch_bias(318)
|
|
|
|
# elif _MIPS_SIM == _MIPS_SIM_ABI64
|
|
|
|
# define systemd_NR_memfd_create systemd_SC_arch_bias(314)
|
2020-08-18 09:22:20 +02:00
|
|
|
# endif
|
2020-12-07 05:32:04 +01:00
|
|
|
#elif defined(__powerpc__)
|
|
|
|
# define systemd_NR_memfd_create 360
|
|
|
|
#elif defined(__s390__)
|
|
|
|
# define systemd_NR_memfd_create 350
|
2020-12-08 06:59:45 +01:00
|
|
|
#elif defined(__sparc__)
|
|
|
|
# define systemd_NR_memfd_create 348
|
2020-12-07 05:32:04 +01:00
|
|
|
#elif defined(__x86_64__)
|
|
|
|
# define systemd_NR_memfd_create systemd_SC_arch_bias(319)
|
2020-08-18 09:22:20 +02:00
|
|
|
#else
|
2020-12-08 07:35:57 +01:00
|
|
|
# warning "memfd_create() syscall number is unknown for your architecture"
|
2020-08-18 09:22:20 +02:00
|
|
|
#endif
|
|
|
|
|
2019-08-15 03:08:36 +02:00
|
|
|
/* may be (invalid) negative number due to libseccomp, see PR 13319 */
|
2020-08-18 09:22:20 +02:00
|
|
|
#if defined __NR_memfd_create && __NR_memfd_create >= 0
|
|
|
|
# if defined systemd_NR_memfd_create
|
|
|
|
assert_cc(__NR_memfd_create == systemd_NR_memfd_create);
|
|
|
|
# endif
|
|
|
|
#else
|
|
|
|
# if defined __NR_memfd_create
|
|
|
|
# undef __NR_memfd_create
|
|
|
|
# endif
|
|
|
|
# if defined systemd_NR_memfd_create
|
|
|
|
# define __NR_memfd_create systemd_NR_memfd_create
|
2016-03-17 18:26:13 +01:00
|
|
|
# endif
|
2020-08-18 09:22:20 +02:00
|
|
|
#endif
|
2016-03-17 18:26:13 +01:00
|
|
|
|
2020-08-18 09:22:20 +02:00
|
|
|
#if !HAVE_MEMFD_CREATE
|
missing_syscall: when adding syscall replacements, use different names (#8229)
In meson.build we check that functions are available using:
meson.get_compiler('c').has_function('foo')
which checks the following:
- if __stub_foo or __stub___foo are defined, return false
- if foo is declared (a pointer to the function can be taken), return true
- otherwise check for __builtin_memfd_create
_stub is documented by glibc as
It defines a symbol '__stub_FUNCTION' for each function
in the C library which is a stub, meaning it will fail
every time called, usually setting errno to ENOSYS.
So if __stub is defined, we know we don't want to use the glibc version, but
this doesn't tell us if the name itself is defined or not. If it _is_ defined,
and we define our replacement as an inline static function, we get an error:
In file included from ../src/basic/missing.h:1358:0,
from ../src/basic/util.h:47,
from ../src/basic/calendarspec.h:29,
from ../src/basic/calendarspec.c:34:
../src/basic/missing_syscall.h:65:19: error: static declaration of 'memfd_create' follows non-static declaration
static inline int memfd_create(const char *name, unsigned int flags) {
^~~~~~~~~~~~
.../usr/include/bits/mman-shared.h:46:5: note: previous declaration of 'memfd_create' was here
int memfd_create (const char *__name, unsigned int __flags) __THROW;
^~~~~~~~~~~~
To avoid this problem, call our inline functions different than glibc,
and use a #define to map the official name to our replacement.
Fixes #8099.
v2:
- use "missing_" as the prefix instead of "_"
v3:
- rebase and update for statx()
Unfortunately "statx" is also present in "struct statx", so the define
causes issues. Work around this by using a typedef.
I checked that systemd compiles with current glibc
(glibc-devel-2.26-24.fc27.x86_64) if HAVE_MEMFD_CREATE, HAVE_GETTID,
HAVE_PIVOT_ROOT, HAVE_SETNS, HAVE_RENAMEAT2, HAVE_KCMP, HAVE_KEYCTL,
HAVE_COPY_FILE_RANGE, HAVE_BPF, HAVE_STATX are forced to 0.
Setting HAVE_NAME_TO_HANDLE_AT to 0 causes an issue, but it's not because of
the define, but because of struct file_handle.
2018-02-21 14:04:50 +01:00
|
|
|
static inline int missing_memfd_create(const char *name, unsigned int flags) {
|
2016-03-17 18:26:13 +01:00
|
|
|
# ifdef __NR_memfd_create
|
|
|
|
return syscall(__NR_memfd_create, name, flags);
|
|
|
|
# else
|
|
|
|
errno = ENOSYS;
|
|
|
|
return -1;
|
|
|
|
# endif
|
|
|
|
}
|
missing_syscall: when adding syscall replacements, use different names (#8229)
In meson.build we check that functions are available using:
meson.get_compiler('c').has_function('foo')
which checks the following:
- if __stub_foo or __stub___foo are defined, return false
- if foo is declared (a pointer to the function can be taken), return true
- otherwise check for __builtin_memfd_create
_stub is documented by glibc as
It defines a symbol '__stub_FUNCTION' for each function
in the C library which is a stub, meaning it will fail
every time called, usually setting errno to ENOSYS.
So if __stub is defined, we know we don't want to use the glibc version, but
this doesn't tell us if the name itself is defined or not. If it _is_ defined,
and we define our replacement as an inline static function, we get an error:
In file included from ../src/basic/missing.h:1358:0,
from ../src/basic/util.h:47,
from ../src/basic/calendarspec.h:29,
from ../src/basic/calendarspec.c:34:
../src/basic/missing_syscall.h:65:19: error: static declaration of 'memfd_create' follows non-static declaration
static inline int memfd_create(const char *name, unsigned int flags) {
^~~~~~~~~~~~
.../usr/include/bits/mman-shared.h:46:5: note: previous declaration of 'memfd_create' was here
int memfd_create (const char *__name, unsigned int __flags) __THROW;
^~~~~~~~~~~~
To avoid this problem, call our inline functions different than glibc,
and use a #define to map the official name to our replacement.
Fixes #8099.
v2:
- use "missing_" as the prefix instead of "_"
v3:
- rebase and update for statx()
Unfortunately "statx" is also present in "struct statx", so the define
causes issues. Work around this by using a typedef.
I checked that systemd compiles with current glibc
(glibc-devel-2.26-24.fc27.x86_64) if HAVE_MEMFD_CREATE, HAVE_GETTID,
HAVE_PIVOT_ROOT, HAVE_SETNS, HAVE_RENAMEAT2, HAVE_KCMP, HAVE_KEYCTL,
HAVE_COPY_FILE_RANGE, HAVE_BPF, HAVE_STATX are forced to 0.
Setting HAVE_NAME_TO_HANDLE_AT to 0 causes an issue, but it's not because of
the define, but because of struct file_handle.
2018-02-21 14:04:50 +01:00
|
|
|
|
|
|
|
# define memfd_create missing_memfd_create
|
2016-03-17 18:26:13 +01:00
|
|
|
#endif
|
|
|
|
|
|
|
|
/* ======================================================================= */
|
|
|
|
|
2020-12-07 05:32:04 +01:00
|
|
|
#if defined(__aarch64__)
|
2020-08-18 09:22:20 +02:00
|
|
|
# define systemd_NR_getrandom 278
|
2020-12-07 00:45:49 +01:00
|
|
|
#elif defined(__alpha__)
|
|
|
|
# define systemd_NR_getrandom 511
|
2020-12-08 06:59:45 +01:00
|
|
|
#elif defined(__arc__) || defined(__tilegx__)
|
2020-12-07 05:32:04 +01:00
|
|
|
# define systemd_NR_getrandom 278
|
|
|
|
#elif defined(__arm__)
|
|
|
|
# define systemd_NR_getrandom 384
|
|
|
|
#elif defined(__i386__)
|
|
|
|
# define systemd_NR_getrandom 355
|
2020-08-18 09:22:20 +02:00
|
|
|
#elif defined(__ia64__)
|
2020-11-13 06:58:49 +01:00
|
|
|
# define systemd_NR_getrandom systemd_SC_arch_bias(318)
|
2020-08-18 09:22:20 +02:00
|
|
|
#elif defined(__m68k__)
|
|
|
|
# define systemd_NR_getrandom 352
|
2020-12-07 05:32:04 +01:00
|
|
|
#elif defined(_MIPS_SIM)
|
2020-08-18 09:22:20 +02:00
|
|
|
# if _MIPS_SIM == _MIPS_SIM_ABI32
|
2020-11-13 06:58:49 +01:00
|
|
|
# define systemd_NR_getrandom systemd_SC_arch_bias(353)
|
|
|
|
# elif _MIPS_SIM == _MIPS_SIM_NABI32
|
|
|
|
# define systemd_NR_getrandom systemd_SC_arch_bias(317)
|
|
|
|
# elif _MIPS_SIM == _MIPS_SIM_ABI64
|
|
|
|
# define systemd_NR_getrandom systemd_SC_arch_bias(313)
|
2020-08-18 09:22:20 +02:00
|
|
|
# endif
|
2020-12-07 05:32:04 +01:00
|
|
|
#elif defined(__powerpc__)
|
|
|
|
# define systemd_NR_getrandom 359
|
2020-12-08 06:54:20 +01:00
|
|
|
#elif defined(__s390__)
|
2020-12-07 05:32:04 +01:00
|
|
|
# define systemd_NR_getrandom 349
|
2020-12-08 06:59:45 +01:00
|
|
|
#elif defined(__sparc__)
|
|
|
|
# define systemd_NR_getrandom 347
|
2020-12-07 05:32:04 +01:00
|
|
|
#elif defined(__x86_64__)
|
|
|
|
# define systemd_NR_getrandom systemd_SC_arch_bias(318)
|
2020-08-18 09:22:20 +02:00
|
|
|
#else
|
2020-12-08 07:35:57 +01:00
|
|
|
# warning "getrandom() syscall number is unknown for your architecture"
|
2020-08-18 09:22:20 +02:00
|
|
|
#endif
|
|
|
|
|
2019-08-15 03:08:36 +02:00
|
|
|
/* may be (invalid) negative number due to libseccomp, see PR 13319 */
|
2020-08-18 09:22:20 +02:00
|
|
|
#if defined __NR_getrandom && __NR_getrandom >= 0
|
|
|
|
# if defined systemd_NR_getrandom
|
|
|
|
assert_cc(__NR_getrandom == systemd_NR_getrandom);
|
|
|
|
# endif
|
|
|
|
#else
|
|
|
|
# if defined __NR_getrandom
|
|
|
|
# undef __NR_getrandom
|
2016-03-17 18:26:13 +01:00
|
|
|
# endif
|
2020-08-18 09:22:20 +02:00
|
|
|
# if defined systemd_NR_getrandom
|
|
|
|
# define __NR_getrandom systemd_NR_getrandom
|
|
|
|
# endif
|
|
|
|
#endif
|
2016-03-17 18:26:13 +01:00
|
|
|
|
2020-08-18 09:22:20 +02:00
|
|
|
#if !HAVE_GETRANDOM
|
missing_syscall: when adding syscall replacements, use different names (#8229)
In meson.build we check that functions are available using:
meson.get_compiler('c').has_function('foo')
which checks the following:
- if __stub_foo or __stub___foo are defined, return false
- if foo is declared (a pointer to the function can be taken), return true
- otherwise check for __builtin_memfd_create
_stub is documented by glibc as
It defines a symbol '__stub_FUNCTION' for each function
in the C library which is a stub, meaning it will fail
every time called, usually setting errno to ENOSYS.
So if __stub is defined, we know we don't want to use the glibc version, but
this doesn't tell us if the name itself is defined or not. If it _is_ defined,
and we define our replacement as an inline static function, we get an error:
In file included from ../src/basic/missing.h:1358:0,
from ../src/basic/util.h:47,
from ../src/basic/calendarspec.h:29,
from ../src/basic/calendarspec.c:34:
../src/basic/missing_syscall.h:65:19: error: static declaration of 'memfd_create' follows non-static declaration
static inline int memfd_create(const char *name, unsigned int flags) {
^~~~~~~~~~~~
.../usr/include/bits/mman-shared.h:46:5: note: previous declaration of 'memfd_create' was here
int memfd_create (const char *__name, unsigned int __flags) __THROW;
^~~~~~~~~~~~
To avoid this problem, call our inline functions different than glibc,
and use a #define to map the official name to our replacement.
Fixes #8099.
v2:
- use "missing_" as the prefix instead of "_"
v3:
- rebase and update for statx()
Unfortunately "statx" is also present in "struct statx", so the define
causes issues. Work around this by using a typedef.
I checked that systemd compiles with current glibc
(glibc-devel-2.26-24.fc27.x86_64) if HAVE_MEMFD_CREATE, HAVE_GETTID,
HAVE_PIVOT_ROOT, HAVE_SETNS, HAVE_RENAMEAT2, HAVE_KCMP, HAVE_KEYCTL,
HAVE_COPY_FILE_RANGE, HAVE_BPF, HAVE_STATX are forced to 0.
Setting HAVE_NAME_TO_HANDLE_AT to 0 causes an issue, but it's not because of
the define, but because of struct file_handle.
2018-02-21 14:04:50 +01:00
|
|
|
static inline int missing_getrandom(void *buffer, size_t count, unsigned flags) {
|
2016-03-17 18:26:13 +01:00
|
|
|
# ifdef __NR_getrandom
|
|
|
|
return syscall(__NR_getrandom, buffer, count, flags);
|
|
|
|
# else
|
|
|
|
errno = ENOSYS;
|
|
|
|
return -1;
|
|
|
|
# endif
|
|
|
|
}
|
missing_syscall: when adding syscall replacements, use different names (#8229)
In meson.build we check that functions are available using:
meson.get_compiler('c').has_function('foo')
which checks the following:
- if __stub_foo or __stub___foo are defined, return false
- if foo is declared (a pointer to the function can be taken), return true
- otherwise check for __builtin_memfd_create
_stub is documented by glibc as
It defines a symbol '__stub_FUNCTION' for each function
in the C library which is a stub, meaning it will fail
every time called, usually setting errno to ENOSYS.
So if __stub is defined, we know we don't want to use the glibc version, but
this doesn't tell us if the name itself is defined or not. If it _is_ defined,
and we define our replacement as an inline static function, we get an error:
In file included from ../src/basic/missing.h:1358:0,
from ../src/basic/util.h:47,
from ../src/basic/calendarspec.h:29,
from ../src/basic/calendarspec.c:34:
../src/basic/missing_syscall.h:65:19: error: static declaration of 'memfd_create' follows non-static declaration
static inline int memfd_create(const char *name, unsigned int flags) {
^~~~~~~~~~~~
.../usr/include/bits/mman-shared.h:46:5: note: previous declaration of 'memfd_create' was here
int memfd_create (const char *__name, unsigned int __flags) __THROW;
^~~~~~~~~~~~
To avoid this problem, call our inline functions different than glibc,
and use a #define to map the official name to our replacement.
Fixes #8099.
v2:
- use "missing_" as the prefix instead of "_"
v3:
- rebase and update for statx()
Unfortunately "statx" is also present in "struct statx", so the define
causes issues. Work around this by using a typedef.
I checked that systemd compiles with current glibc
(glibc-devel-2.26-24.fc27.x86_64) if HAVE_MEMFD_CREATE, HAVE_GETTID,
HAVE_PIVOT_ROOT, HAVE_SETNS, HAVE_RENAMEAT2, HAVE_KCMP, HAVE_KEYCTL,
HAVE_COPY_FILE_RANGE, HAVE_BPF, HAVE_STATX are forced to 0.
Setting HAVE_NAME_TO_HANDLE_AT to 0 causes an issue, but it's not because of
the define, but because of struct file_handle.
2018-02-21 14:04:50 +01:00
|
|
|
|
|
|
|
# define getrandom missing_getrandom
|
2016-03-17 18:26:13 +01:00
|
|
|
#endif
|
|
|
|
|
|
|
|
/* ======================================================================= */
|
|
|
|
|
2020-08-18 09:22:20 +02:00
|
|
|
/* The syscall has been defined since forever, but the glibc wrapper was missing. */
|
2017-10-03 10:32:34 +02:00
|
|
|
#if !HAVE_GETTID
|
missing_syscall: when adding syscall replacements, use different names (#8229)
In meson.build we check that functions are available using:
meson.get_compiler('c').has_function('foo')
which checks the following:
- if __stub_foo or __stub___foo are defined, return false
- if foo is declared (a pointer to the function can be taken), return true
- otherwise check for __builtin_memfd_create
_stub is documented by glibc as
It defines a symbol '__stub_FUNCTION' for each function
in the C library which is a stub, meaning it will fail
every time called, usually setting errno to ENOSYS.
So if __stub is defined, we know we don't want to use the glibc version, but
this doesn't tell us if the name itself is defined or not. If it _is_ defined,
and we define our replacement as an inline static function, we get an error:
In file included from ../src/basic/missing.h:1358:0,
from ../src/basic/util.h:47,
from ../src/basic/calendarspec.h:29,
from ../src/basic/calendarspec.c:34:
../src/basic/missing_syscall.h:65:19: error: static declaration of 'memfd_create' follows non-static declaration
static inline int memfd_create(const char *name, unsigned int flags) {
^~~~~~~~~~~~
.../usr/include/bits/mman-shared.h:46:5: note: previous declaration of 'memfd_create' was here
int memfd_create (const char *__name, unsigned int __flags) __THROW;
^~~~~~~~~~~~
To avoid this problem, call our inline functions different than glibc,
and use a #define to map the official name to our replacement.
Fixes #8099.
v2:
- use "missing_" as the prefix instead of "_"
v3:
- rebase and update for statx()
Unfortunately "statx" is also present in "struct statx", so the define
causes issues. Work around this by using a typedef.
I checked that systemd compiles with current glibc
(glibc-devel-2.26-24.fc27.x86_64) if HAVE_MEMFD_CREATE, HAVE_GETTID,
HAVE_PIVOT_ROOT, HAVE_SETNS, HAVE_RENAMEAT2, HAVE_KCMP, HAVE_KEYCTL,
HAVE_COPY_FILE_RANGE, HAVE_BPF, HAVE_STATX are forced to 0.
Setting HAVE_NAME_TO_HANDLE_AT to 0 causes an issue, but it's not because of
the define, but because of struct file_handle.
2018-02-21 14:04:50 +01:00
|
|
|
static inline pid_t missing_gettid(void) {
|
2020-08-18 09:22:20 +02:00
|
|
|
# if defined __NR_gettid && __NR_gettid >= 0
|
2018-02-21 17:27:34 +01:00
|
|
|
return (pid_t) syscall(__NR_gettid);
|
2020-08-18 09:22:20 +02:00
|
|
|
# else
|
|
|
|
# error "__NR_gettid not defined"
|
|
|
|
# endif
|
2016-03-17 18:26:13 +01:00
|
|
|
}
|
missing_syscall: when adding syscall replacements, use different names (#8229)
In meson.build we check that functions are available using:
meson.get_compiler('c').has_function('foo')
which checks the following:
- if __stub_foo or __stub___foo are defined, return false
- if foo is declared (a pointer to the function can be taken), return true
- otherwise check for __builtin_memfd_create
_stub is documented by glibc as
It defines a symbol '__stub_FUNCTION' for each function
in the C library which is a stub, meaning it will fail
every time called, usually setting errno to ENOSYS.
So if __stub is defined, we know we don't want to use the glibc version, but
this doesn't tell us if the name itself is defined or not. If it _is_ defined,
and we define our replacement as an inline static function, we get an error:
In file included from ../src/basic/missing.h:1358:0,
from ../src/basic/util.h:47,
from ../src/basic/calendarspec.h:29,
from ../src/basic/calendarspec.c:34:
../src/basic/missing_syscall.h:65:19: error: static declaration of 'memfd_create' follows non-static declaration
static inline int memfd_create(const char *name, unsigned int flags) {
^~~~~~~~~~~~
.../usr/include/bits/mman-shared.h:46:5: note: previous declaration of 'memfd_create' was here
int memfd_create (const char *__name, unsigned int __flags) __THROW;
^~~~~~~~~~~~
To avoid this problem, call our inline functions different than glibc,
and use a #define to map the official name to our replacement.
Fixes #8099.
v2:
- use "missing_" as the prefix instead of "_"
v3:
- rebase and update for statx()
Unfortunately "statx" is also present in "struct statx", so the define
causes issues. Work around this by using a typedef.
I checked that systemd compiles with current glibc
(glibc-devel-2.26-24.fc27.x86_64) if HAVE_MEMFD_CREATE, HAVE_GETTID,
HAVE_PIVOT_ROOT, HAVE_SETNS, HAVE_RENAMEAT2, HAVE_KCMP, HAVE_KEYCTL,
HAVE_COPY_FILE_RANGE, HAVE_BPF, HAVE_STATX are forced to 0.
Setting HAVE_NAME_TO_HANDLE_AT to 0 causes an issue, but it's not because of
the define, but because of struct file_handle.
2018-02-21 14:04:50 +01:00
|
|
|
|
|
|
|
# define gettid missing_gettid
|
2016-03-17 18:26:13 +01:00
|
|
|
#endif
|
|
|
|
|
|
|
|
/* ======================================================================= */
|
|
|
|
|
2020-12-07 05:32:04 +01:00
|
|
|
#if defined(__aarch64__)
|
2020-08-22 16:38:29 +02:00
|
|
|
# define systemd_NR_name_to_handle_at 264
|
2020-12-07 00:45:49 +01:00
|
|
|
#elif defined(__alpha__)
|
|
|
|
# define systemd_NR_name_to_handle_at 497
|
2020-12-08 06:59:45 +01:00
|
|
|
#elif defined(__arc__) || defined(__tilegx__)
|
2020-08-18 09:22:20 +02:00
|
|
|
# define systemd_NR_name_to_handle_at 264
|
2020-12-07 05:32:04 +01:00
|
|
|
#elif defined(__arm__)
|
|
|
|
# define systemd_NR_name_to_handle_at 370
|
|
|
|
#elif defined(__i386__)
|
|
|
|
# define systemd_NR_name_to_handle_at 341
|
2020-12-08 06:59:45 +01:00
|
|
|
#elif defined(__ia64__)
|
|
|
|
# define systemd_NR_name_to_handle_at systemd_SC_arch_bias(302)
|
|
|
|
#elif defined(__m68k__)
|
|
|
|
# define systemd_NR_name_to_handle_at 340
|
2020-12-07 05:32:04 +01:00
|
|
|
#elif defined(_MIPS_SIM)
|
2020-11-13 06:58:49 +01:00
|
|
|
# if _MIPS_SIM == _MIPS_SIM_ABI32
|
|
|
|
# define systemd_NR_name_to_handle_at systemd_SC_arch_bias(339)
|
|
|
|
# elif _MIPS_SIM == _MIPS_SIM_NABI32
|
|
|
|
# define systemd_NR_name_to_handle_at systemd_SC_arch_bias(303)
|
|
|
|
# elif _MIPS_SIM == _MIPS_SIM_ABI64
|
|
|
|
# define systemd_NR_name_to_handle_at systemd_SC_arch_bias(298)
|
|
|
|
# endif
|
2020-12-07 05:32:04 +01:00
|
|
|
#elif defined(__powerpc__)
|
|
|
|
# define systemd_NR_name_to_handle_at 345
|
2020-12-08 06:54:20 +01:00
|
|
|
#elif defined(__s390__)
|
2020-12-07 05:32:04 +01:00
|
|
|
# define systemd_NR_name_to_handle_at 335
|
2020-12-08 06:59:45 +01:00
|
|
|
#elif defined(__sparc__)
|
|
|
|
# define systemd_NR_name_to_handle_at 332
|
2020-12-07 05:32:04 +01:00
|
|
|
#elif defined(__x86_64__)
|
|
|
|
# define systemd_NR_name_to_handle_at systemd_SC_arch_bias(303)
|
2020-08-18 09:22:20 +02:00
|
|
|
#else
|
2020-12-08 07:35:57 +01:00
|
|
|
# warning "name_to_handle_at() syscall number is unknown for your architecture"
|
2020-08-18 09:22:20 +02:00
|
|
|
#endif
|
|
|
|
|
2019-08-15 03:08:36 +02:00
|
|
|
/* may be (invalid) negative number due to libseccomp, see PR 13319 */
|
2020-08-18 09:22:20 +02:00
|
|
|
#if defined __NR_name_to_handle_at && __NR_name_to_handle_at >= 0
|
|
|
|
# if defined systemd_NR_name_to_handle_at
|
|
|
|
assert_cc(__NR_name_to_handle_at == systemd_NR_name_to_handle_at);
|
|
|
|
# endif
|
|
|
|
#else
|
|
|
|
# if defined __NR_name_to_handle_at
|
|
|
|
# undef __NR_name_to_handle_at
|
|
|
|
# endif
|
|
|
|
# if defined systemd_NR_name_to_handle_at
|
|
|
|
# define __NR_name_to_handle_at systemd_NR_name_to_handle_at
|
2016-03-17 18:26:13 +01:00
|
|
|
# endif
|
2020-08-18 09:22:20 +02:00
|
|
|
#endif
|
2016-03-17 18:26:13 +01:00
|
|
|
|
2020-08-18 09:22:20 +02:00
|
|
|
#if !HAVE_NAME_TO_HANDLE_AT
|
2016-03-17 18:26:13 +01:00
|
|
|
struct file_handle {
|
|
|
|
unsigned int handle_bytes;
|
|
|
|
int handle_type;
|
|
|
|
unsigned char f_handle[0];
|
|
|
|
};
|
|
|
|
|
missing_syscall: when adding syscall replacements, use different names (#8229)
In meson.build we check that functions are available using:
meson.get_compiler('c').has_function('foo')
which checks the following:
- if __stub_foo or __stub___foo are defined, return false
- if foo is declared (a pointer to the function can be taken), return true
- otherwise check for __builtin_memfd_create
_stub is documented by glibc as
It defines a symbol '__stub_FUNCTION' for each function
in the C library which is a stub, meaning it will fail
every time called, usually setting errno to ENOSYS.
So if __stub is defined, we know we don't want to use the glibc version, but
this doesn't tell us if the name itself is defined or not. If it _is_ defined,
and we define our replacement as an inline static function, we get an error:
In file included from ../src/basic/missing.h:1358:0,
from ../src/basic/util.h:47,
from ../src/basic/calendarspec.h:29,
from ../src/basic/calendarspec.c:34:
../src/basic/missing_syscall.h:65:19: error: static declaration of 'memfd_create' follows non-static declaration
static inline int memfd_create(const char *name, unsigned int flags) {
^~~~~~~~~~~~
.../usr/include/bits/mman-shared.h:46:5: note: previous declaration of 'memfd_create' was here
int memfd_create (const char *__name, unsigned int __flags) __THROW;
^~~~~~~~~~~~
To avoid this problem, call our inline functions different than glibc,
and use a #define to map the official name to our replacement.
Fixes #8099.
v2:
- use "missing_" as the prefix instead of "_"
v3:
- rebase and update for statx()
Unfortunately "statx" is also present in "struct statx", so the define
causes issues. Work around this by using a typedef.
I checked that systemd compiles with current glibc
(glibc-devel-2.26-24.fc27.x86_64) if HAVE_MEMFD_CREATE, HAVE_GETTID,
HAVE_PIVOT_ROOT, HAVE_SETNS, HAVE_RENAMEAT2, HAVE_KCMP, HAVE_KEYCTL,
HAVE_COPY_FILE_RANGE, HAVE_BPF, HAVE_STATX are forced to 0.
Setting HAVE_NAME_TO_HANDLE_AT to 0 causes an issue, but it's not because of
the define, but because of struct file_handle.
2018-02-21 14:04:50 +01:00
|
|
|
static inline int missing_name_to_handle_at(int fd, const char *name, struct file_handle *handle, int *mnt_id, int flags) {
|
2016-03-17 18:26:13 +01:00
|
|
|
# ifdef __NR_name_to_handle_at
|
|
|
|
return syscall(__NR_name_to_handle_at, fd, name, handle, mnt_id, flags);
|
|
|
|
# else
|
|
|
|
errno = ENOSYS;
|
|
|
|
return -1;
|
|
|
|
# endif
|
|
|
|
}
|
missing_syscall: when adding syscall replacements, use different names (#8229)
In meson.build we check that functions are available using:
meson.get_compiler('c').has_function('foo')
which checks the following:
- if __stub_foo or __stub___foo are defined, return false
- if foo is declared (a pointer to the function can be taken), return true
- otherwise check for __builtin_memfd_create
_stub is documented by glibc as
It defines a symbol '__stub_FUNCTION' for each function
in the C library which is a stub, meaning it will fail
every time called, usually setting errno to ENOSYS.
So if __stub is defined, we know we don't want to use the glibc version, but
this doesn't tell us if the name itself is defined or not. If it _is_ defined,
and we define our replacement as an inline static function, we get an error:
In file included from ../src/basic/missing.h:1358:0,
from ../src/basic/util.h:47,
from ../src/basic/calendarspec.h:29,
from ../src/basic/calendarspec.c:34:
../src/basic/missing_syscall.h:65:19: error: static declaration of 'memfd_create' follows non-static declaration
static inline int memfd_create(const char *name, unsigned int flags) {
^~~~~~~~~~~~
.../usr/include/bits/mman-shared.h:46:5: note: previous declaration of 'memfd_create' was here
int memfd_create (const char *__name, unsigned int __flags) __THROW;
^~~~~~~~~~~~
To avoid this problem, call our inline functions different than glibc,
and use a #define to map the official name to our replacement.
Fixes #8099.
v2:
- use "missing_" as the prefix instead of "_"
v3:
- rebase and update for statx()
Unfortunately "statx" is also present in "struct statx", so the define
causes issues. Work around this by using a typedef.
I checked that systemd compiles with current glibc
(glibc-devel-2.26-24.fc27.x86_64) if HAVE_MEMFD_CREATE, HAVE_GETTID,
HAVE_PIVOT_ROOT, HAVE_SETNS, HAVE_RENAMEAT2, HAVE_KCMP, HAVE_KEYCTL,
HAVE_COPY_FILE_RANGE, HAVE_BPF, HAVE_STATX are forced to 0.
Setting HAVE_NAME_TO_HANDLE_AT to 0 causes an issue, but it's not because of
the define, but because of struct file_handle.
2018-02-21 14:04:50 +01:00
|
|
|
|
|
|
|
# define name_to_handle_at missing_name_to_handle_at
|
2016-03-17 18:26:13 +01:00
|
|
|
#endif
|
|
|
|
|
|
|
|
/* ======================================================================= */
|
|
|
|
|
2020-12-07 05:32:04 +01:00
|
|
|
#if defined(__aarch64__)
|
2020-08-22 16:38:29 +02:00
|
|
|
# define systemd_NR_setns 268
|
2020-12-07 05:32:04 +01:00
|
|
|
#elif defined(__alpha__)
|
2020-12-07 00:45:49 +01:00
|
|
|
# define systemd_NR_setns 501
|
2020-12-08 06:59:45 +01:00
|
|
|
#elif defined(__arc__) || defined(__tilegx__)
|
2020-08-18 09:22:20 +02:00
|
|
|
# define systemd_NR_setns 268
|
2020-12-07 05:32:04 +01:00
|
|
|
#elif defined(__arm__)
|
|
|
|
# define systemd_NR_setns 375
|
|
|
|
#elif defined(__i386__)
|
|
|
|
# define systemd_NR_setns 346
|
2020-12-08 06:59:45 +01:00
|
|
|
#elif defined(__ia64__)
|
|
|
|
# define systemd_NR_setns systemd_SC_arch_bias(306)
|
|
|
|
#elif defined(__m68k__)
|
|
|
|
# define systemd_NR_setns 344
|
2020-12-07 05:32:04 +01:00
|
|
|
#elif defined(_MIPS_SIM)
|
2020-11-13 06:58:49 +01:00
|
|
|
# if _MIPS_SIM == _MIPS_SIM_ABI32
|
|
|
|
# define systemd_NR_setns systemd_SC_arch_bias(344)
|
|
|
|
# elif _MIPS_SIM == _MIPS_SIM_NABI32
|
|
|
|
# define systemd_NR_setns systemd_SC_arch_bias(308)
|
|
|
|
# elif _MIPS_SIM == _MIPS_SIM_ABI64
|
|
|
|
# define systemd_NR_setns systemd_SC_arch_bias(303)
|
|
|
|
# endif
|
2020-12-07 05:32:04 +01:00
|
|
|
#elif defined(__powerpc__)
|
|
|
|
# define systemd_NR_setns 350
|
2020-12-08 06:54:20 +01:00
|
|
|
#elif defined(__s390__)
|
2020-12-07 05:32:04 +01:00
|
|
|
# define systemd_NR_setns 339
|
2020-12-08 06:59:45 +01:00
|
|
|
#elif defined(__sparc__)
|
|
|
|
# define systemd_NR_setns 337
|
2020-12-07 05:32:04 +01:00
|
|
|
#elif defined(__x86_64__)
|
|
|
|
# define systemd_NR_setns systemd_SC_arch_bias(308)
|
2020-08-18 09:22:20 +02:00
|
|
|
#else
|
2020-12-08 07:35:57 +01:00
|
|
|
# warning "setns() syscall number is unknown for your architecture"
|
2020-08-18 09:22:20 +02:00
|
|
|
#endif
|
|
|
|
|
2019-08-15 03:08:36 +02:00
|
|
|
/* may be (invalid) negative number due to libseccomp, see PR 13319 */
|
2020-08-18 09:22:20 +02:00
|
|
|
#if defined __NR_setns && __NR_setns >= 0
|
|
|
|
# if defined systemd_NR_setns
|
|
|
|
assert_cc(__NR_setns == systemd_NR_setns);
|
|
|
|
# endif
|
|
|
|
#else
|
|
|
|
# if defined __NR_setns
|
|
|
|
# undef __NR_setns
|
2016-03-17 18:26:13 +01:00
|
|
|
# endif
|
2020-08-18 09:22:20 +02:00
|
|
|
# if defined systemd_NR_setns
|
|
|
|
# define __NR_setns systemd_NR_setns
|
|
|
|
# endif
|
|
|
|
#endif
|
2016-03-17 18:26:13 +01:00
|
|
|
|
2020-08-18 09:22:20 +02:00
|
|
|
#if !HAVE_SETNS
|
missing_syscall: when adding syscall replacements, use different names (#8229)
In meson.build we check that functions are available using:
meson.get_compiler('c').has_function('foo')
which checks the following:
- if __stub_foo or __stub___foo are defined, return false
- if foo is declared (a pointer to the function can be taken), return true
- otherwise check for __builtin_memfd_create
_stub is documented by glibc as
It defines a symbol '__stub_FUNCTION' for each function
in the C library which is a stub, meaning it will fail
every time called, usually setting errno to ENOSYS.
So if __stub is defined, we know we don't want to use the glibc version, but
this doesn't tell us if the name itself is defined or not. If it _is_ defined,
and we define our replacement as an inline static function, we get an error:
In file included from ../src/basic/missing.h:1358:0,
from ../src/basic/util.h:47,
from ../src/basic/calendarspec.h:29,
from ../src/basic/calendarspec.c:34:
../src/basic/missing_syscall.h:65:19: error: static declaration of 'memfd_create' follows non-static declaration
static inline int memfd_create(const char *name, unsigned int flags) {
^~~~~~~~~~~~
.../usr/include/bits/mman-shared.h:46:5: note: previous declaration of 'memfd_create' was here
int memfd_create (const char *__name, unsigned int __flags) __THROW;
^~~~~~~~~~~~
To avoid this problem, call our inline functions different than glibc,
and use a #define to map the official name to our replacement.
Fixes #8099.
v2:
- use "missing_" as the prefix instead of "_"
v3:
- rebase and update for statx()
Unfortunately "statx" is also present in "struct statx", so the define
causes issues. Work around this by using a typedef.
I checked that systemd compiles with current glibc
(glibc-devel-2.26-24.fc27.x86_64) if HAVE_MEMFD_CREATE, HAVE_GETTID,
HAVE_PIVOT_ROOT, HAVE_SETNS, HAVE_RENAMEAT2, HAVE_KCMP, HAVE_KEYCTL,
HAVE_COPY_FILE_RANGE, HAVE_BPF, HAVE_STATX are forced to 0.
Setting HAVE_NAME_TO_HANDLE_AT to 0 causes an issue, but it's not because of
the define, but because of struct file_handle.
2018-02-21 14:04:50 +01:00
|
|
|
static inline int missing_setns(int fd, int nstype) {
|
2016-03-17 18:26:13 +01:00
|
|
|
# ifdef __NR_setns
|
|
|
|
return syscall(__NR_setns, fd, nstype);
|
|
|
|
# else
|
|
|
|
errno = ENOSYS;
|
|
|
|
return -1;
|
|
|
|
# endif
|
|
|
|
}
|
missing_syscall: when adding syscall replacements, use different names (#8229)
In meson.build we check that functions are available using:
meson.get_compiler('c').has_function('foo')
which checks the following:
- if __stub_foo or __stub___foo are defined, return false
- if foo is declared (a pointer to the function can be taken), return true
- otherwise check for __builtin_memfd_create
_stub is documented by glibc as
It defines a symbol '__stub_FUNCTION' for each function
in the C library which is a stub, meaning it will fail
every time called, usually setting errno to ENOSYS.
So if __stub is defined, we know we don't want to use the glibc version, but
this doesn't tell us if the name itself is defined or not. If it _is_ defined,
and we define our replacement as an inline static function, we get an error:
In file included from ../src/basic/missing.h:1358:0,
from ../src/basic/util.h:47,
from ../src/basic/calendarspec.h:29,
from ../src/basic/calendarspec.c:34:
../src/basic/missing_syscall.h:65:19: error: static declaration of 'memfd_create' follows non-static declaration
static inline int memfd_create(const char *name, unsigned int flags) {
^~~~~~~~~~~~
.../usr/include/bits/mman-shared.h:46:5: note: previous declaration of 'memfd_create' was here
int memfd_create (const char *__name, unsigned int __flags) __THROW;
^~~~~~~~~~~~
To avoid this problem, call our inline functions different than glibc,
and use a #define to map the official name to our replacement.
Fixes #8099.
v2:
- use "missing_" as the prefix instead of "_"
v3:
- rebase and update for statx()
Unfortunately "statx" is also present in "struct statx", so the define
causes issues. Work around this by using a typedef.
I checked that systemd compiles with current glibc
(glibc-devel-2.26-24.fc27.x86_64) if HAVE_MEMFD_CREATE, HAVE_GETTID,
HAVE_PIVOT_ROOT, HAVE_SETNS, HAVE_RENAMEAT2, HAVE_KCMP, HAVE_KEYCTL,
HAVE_COPY_FILE_RANGE, HAVE_BPF, HAVE_STATX are forced to 0.
Setting HAVE_NAME_TO_HANDLE_AT to 0 causes an issue, but it's not because of
the define, but because of struct file_handle.
2018-02-21 14:04:50 +01:00
|
|
|
|
|
|
|
# define setns missing_setns
|
2016-03-17 18:26:13 +01:00
|
|
|
#endif
|
|
|
|
|
|
|
|
/* ======================================================================= */
|
|
|
|
|
|
|
|
static inline pid_t raw_getpid(void) {
|
|
|
|
#if defined(__alpha__)
|
|
|
|
return (pid_t) syscall(__NR_getxpid);
|
|
|
|
#else
|
|
|
|
return (pid_t) syscall(__NR_getpid);
|
|
|
|
#endif
|
|
|
|
}
|
|
|
|
|
|
|
|
/* ======================================================================= */
|
|
|
|
|
2020-12-07 05:32:04 +01:00
|
|
|
#if defined(__aarch64__)
|
2020-08-18 09:22:20 +02:00
|
|
|
# define systemd_NR_renameat2 276
|
2020-12-07 05:32:04 +01:00
|
|
|
#elif defined(__alpha__)
|
2020-12-07 00:45:49 +01:00
|
|
|
# define systemd_NR_renameat2 510
|
2020-12-08 06:59:45 +01:00
|
|
|
#elif defined(__arc__) || defined(__tilegx__)
|
2020-12-07 05:32:04 +01:00
|
|
|
# define systemd_NR_renameat2 276
|
|
|
|
#elif defined(__arm__)
|
|
|
|
# define systemd_NR_renameat2 382
|
|
|
|
#elif defined(__i386__)
|
|
|
|
# define systemd_NR_renameat2 353
|
2020-12-08 06:59:45 +01:00
|
|
|
#elif defined(__ia64__)
|
|
|
|
# define systemd_NR_renameat2 systemd_SC_arch_bias(314)
|
|
|
|
#elif defined(__m68k__)
|
|
|
|
# define systemd_NR_renameat2 351
|
2020-12-07 05:32:04 +01:00
|
|
|
#elif defined(_MIPS_SIM)
|
2020-08-18 09:22:20 +02:00
|
|
|
# if _MIPS_SIM == _MIPS_SIM_ABI32
|
2020-11-13 06:58:49 +01:00
|
|
|
# define systemd_NR_renameat2 systemd_SC_arch_bias(351)
|
|
|
|
# elif _MIPS_SIM == _MIPS_SIM_NABI32
|
|
|
|
# define systemd_NR_renameat2 systemd_SC_arch_bias(315)
|
|
|
|
# elif _MIPS_SIM == _MIPS_SIM_ABI64
|
|
|
|
# define systemd_NR_renameat2 systemd_SC_arch_bias(311)
|
2020-08-18 09:22:20 +02:00
|
|
|
# endif
|
2020-12-08 06:51:58 +01:00
|
|
|
#elif defined(__powerpc__)
|
2020-08-18 09:22:20 +02:00
|
|
|
# define systemd_NR_renameat2 357
|
2020-12-08 06:54:20 +01:00
|
|
|
#elif defined(__s390__)
|
2020-08-18 09:22:20 +02:00
|
|
|
# define systemd_NR_renameat2 347
|
2020-12-08 06:59:45 +01:00
|
|
|
#elif defined(__sparc__)
|
|
|
|
# define systemd_NR_renameat2 345
|
2020-12-07 05:32:04 +01:00
|
|
|
#elif defined(__x86_64__)
|
|
|
|
# define systemd_NR_renameat2 systemd_SC_arch_bias(316)
|
2020-08-18 09:22:20 +02:00
|
|
|
#else
|
2020-12-08 07:35:57 +01:00
|
|
|
# warning "renameat2() syscall number is unknown for your architecture"
|
2020-08-18 09:22:20 +02:00
|
|
|
#endif
|
|
|
|
|
2019-08-15 03:08:36 +02:00
|
|
|
/* may be (invalid) negative number due to libseccomp, see PR 13319 */
|
2020-08-18 09:22:20 +02:00
|
|
|
#if defined __NR_renameat2 && __NR_renameat2 >= 0
|
|
|
|
# if defined systemd_NR_renameat2
|
|
|
|
assert_cc(__NR_renameat2 == systemd_NR_renameat2);
|
|
|
|
# endif
|
|
|
|
#else
|
|
|
|
# if defined __NR_renameat2
|
|
|
|
# undef __NR_renameat2
|
2016-03-17 18:26:13 +01:00
|
|
|
# endif
|
2020-08-18 09:22:20 +02:00
|
|
|
# if defined systemd_NR_renameat2
|
|
|
|
# define __NR_renameat2 systemd_NR_renameat2
|
|
|
|
# endif
|
|
|
|
#endif
|
2016-03-17 18:26:13 +01:00
|
|
|
|
2020-08-18 09:22:20 +02:00
|
|
|
#if !HAVE_RENAMEAT2
|
missing_syscall: when adding syscall replacements, use different names (#8229)
In meson.build we check that functions are available using:
meson.get_compiler('c').has_function('foo')
which checks the following:
- if __stub_foo or __stub___foo are defined, return false
- if foo is declared (a pointer to the function can be taken), return true
- otherwise check for __builtin_memfd_create
_stub is documented by glibc as
It defines a symbol '__stub_FUNCTION' for each function
in the C library which is a stub, meaning it will fail
every time called, usually setting errno to ENOSYS.
So if __stub is defined, we know we don't want to use the glibc version, but
this doesn't tell us if the name itself is defined or not. If it _is_ defined,
and we define our replacement as an inline static function, we get an error:
In file included from ../src/basic/missing.h:1358:0,
from ../src/basic/util.h:47,
from ../src/basic/calendarspec.h:29,
from ../src/basic/calendarspec.c:34:
../src/basic/missing_syscall.h:65:19: error: static declaration of 'memfd_create' follows non-static declaration
static inline int memfd_create(const char *name, unsigned int flags) {
^~~~~~~~~~~~
.../usr/include/bits/mman-shared.h:46:5: note: previous declaration of 'memfd_create' was here
int memfd_create (const char *__name, unsigned int __flags) __THROW;
^~~~~~~~~~~~
To avoid this problem, call our inline functions different than glibc,
and use a #define to map the official name to our replacement.
Fixes #8099.
v2:
- use "missing_" as the prefix instead of "_"
v3:
- rebase and update for statx()
Unfortunately "statx" is also present in "struct statx", so the define
causes issues. Work around this by using a typedef.
I checked that systemd compiles with current glibc
(glibc-devel-2.26-24.fc27.x86_64) if HAVE_MEMFD_CREATE, HAVE_GETTID,
HAVE_PIVOT_ROOT, HAVE_SETNS, HAVE_RENAMEAT2, HAVE_KCMP, HAVE_KEYCTL,
HAVE_COPY_FILE_RANGE, HAVE_BPF, HAVE_STATX are forced to 0.
Setting HAVE_NAME_TO_HANDLE_AT to 0 causes an issue, but it's not because of
the define, but because of struct file_handle.
2018-02-21 14:04:50 +01:00
|
|
|
static inline int missing_renameat2(int oldfd, const char *oldname, int newfd, const char *newname, unsigned flags) {
|
2016-03-17 18:26:13 +01:00
|
|
|
# ifdef __NR_renameat2
|
|
|
|
return syscall(__NR_renameat2, oldfd, oldname, newfd, newname, flags);
|
|
|
|
# else
|
|
|
|
errno = ENOSYS;
|
|
|
|
return -1;
|
|
|
|
# endif
|
|
|
|
}
|
missing_syscall: when adding syscall replacements, use different names (#8229)
In meson.build we check that functions are available using:
meson.get_compiler('c').has_function('foo')
which checks the following:
- if __stub_foo or __stub___foo are defined, return false
- if foo is declared (a pointer to the function can be taken), return true
- otherwise check for __builtin_memfd_create
_stub is documented by glibc as
It defines a symbol '__stub_FUNCTION' for each function
in the C library which is a stub, meaning it will fail
every time called, usually setting errno to ENOSYS.
So if __stub is defined, we know we don't want to use the glibc version, but
this doesn't tell us if the name itself is defined or not. If it _is_ defined,
and we define our replacement as an inline static function, we get an error:
In file included from ../src/basic/missing.h:1358:0,
from ../src/basic/util.h:47,
from ../src/basic/calendarspec.h:29,
from ../src/basic/calendarspec.c:34:
../src/basic/missing_syscall.h:65:19: error: static declaration of 'memfd_create' follows non-static declaration
static inline int memfd_create(const char *name, unsigned int flags) {
^~~~~~~~~~~~
.../usr/include/bits/mman-shared.h:46:5: note: previous declaration of 'memfd_create' was here
int memfd_create (const char *__name, unsigned int __flags) __THROW;
^~~~~~~~~~~~
To avoid this problem, call our inline functions different than glibc,
and use a #define to map the official name to our replacement.
Fixes #8099.
v2:
- use "missing_" as the prefix instead of "_"
v3:
- rebase and update for statx()
Unfortunately "statx" is also present in "struct statx", so the define
causes issues. Work around this by using a typedef.
I checked that systemd compiles with current glibc
(glibc-devel-2.26-24.fc27.x86_64) if HAVE_MEMFD_CREATE, HAVE_GETTID,
HAVE_PIVOT_ROOT, HAVE_SETNS, HAVE_RENAMEAT2, HAVE_KCMP, HAVE_KEYCTL,
HAVE_COPY_FILE_RANGE, HAVE_BPF, HAVE_STATX are forced to 0.
Setting HAVE_NAME_TO_HANDLE_AT to 0 causes an issue, but it's not because of
the define, but because of struct file_handle.
2018-02-21 14:04:50 +01:00
|
|
|
|
|
|
|
# define renameat2 missing_renameat2
|
2016-03-17 18:26:13 +01:00
|
|
|
#endif
|
|
|
|
|
|
|
|
/* ======================================================================= */
|
|
|
|
|
2017-10-03 10:32:34 +02:00
|
|
|
#if !HAVE_KCMP
|
missing_syscall: when adding syscall replacements, use different names (#8229)
In meson.build we check that functions are available using:
meson.get_compiler('c').has_function('foo')
which checks the following:
- if __stub_foo or __stub___foo are defined, return false
- if foo is declared (a pointer to the function can be taken), return true
- otherwise check for __builtin_memfd_create
_stub is documented by glibc as
It defines a symbol '__stub_FUNCTION' for each function
in the C library which is a stub, meaning it will fail
every time called, usually setting errno to ENOSYS.
So if __stub is defined, we know we don't want to use the glibc version, but
this doesn't tell us if the name itself is defined or not. If it _is_ defined,
and we define our replacement as an inline static function, we get an error:
In file included from ../src/basic/missing.h:1358:0,
from ../src/basic/util.h:47,
from ../src/basic/calendarspec.h:29,
from ../src/basic/calendarspec.c:34:
../src/basic/missing_syscall.h:65:19: error: static declaration of 'memfd_create' follows non-static declaration
static inline int memfd_create(const char *name, unsigned int flags) {
^~~~~~~~~~~~
.../usr/include/bits/mman-shared.h:46:5: note: previous declaration of 'memfd_create' was here
int memfd_create (const char *__name, unsigned int __flags) __THROW;
^~~~~~~~~~~~
To avoid this problem, call our inline functions different than glibc,
and use a #define to map the official name to our replacement.
Fixes #8099.
v2:
- use "missing_" as the prefix instead of "_"
v3:
- rebase and update for statx()
Unfortunately "statx" is also present in "struct statx", so the define
causes issues. Work around this by using a typedef.
I checked that systemd compiles with current glibc
(glibc-devel-2.26-24.fc27.x86_64) if HAVE_MEMFD_CREATE, HAVE_GETTID,
HAVE_PIVOT_ROOT, HAVE_SETNS, HAVE_RENAMEAT2, HAVE_KCMP, HAVE_KEYCTL,
HAVE_COPY_FILE_RANGE, HAVE_BPF, HAVE_STATX are forced to 0.
Setting HAVE_NAME_TO_HANDLE_AT to 0 causes an issue, but it's not because of
the define, but because of struct file_handle.
2018-02-21 14:04:50 +01:00
|
|
|
static inline int missing_kcmp(pid_t pid1, pid_t pid2, int type, unsigned long idx1, unsigned long idx2) {
|
2019-12-06 20:28:13 +01:00
|
|
|
# if defined __NR_kcmp && __NR_kcmp >= 0
|
2016-03-17 18:26:13 +01:00
|
|
|
return syscall(__NR_kcmp, pid1, pid2, type, idx1, idx2);
|
|
|
|
# else
|
|
|
|
errno = ENOSYS;
|
|
|
|
return -1;
|
|
|
|
# endif
|
|
|
|
}
|
missing_syscall: when adding syscall replacements, use different names (#8229)
In meson.build we check that functions are available using:
meson.get_compiler('c').has_function('foo')
which checks the following:
- if __stub_foo or __stub___foo are defined, return false
- if foo is declared (a pointer to the function can be taken), return true
- otherwise check for __builtin_memfd_create
_stub is documented by glibc as
It defines a symbol '__stub_FUNCTION' for each function
in the C library which is a stub, meaning it will fail
every time called, usually setting errno to ENOSYS.
So if __stub is defined, we know we don't want to use the glibc version, but
this doesn't tell us if the name itself is defined or not. If it _is_ defined,
and we define our replacement as an inline static function, we get an error:
In file included from ../src/basic/missing.h:1358:0,
from ../src/basic/util.h:47,
from ../src/basic/calendarspec.h:29,
from ../src/basic/calendarspec.c:34:
../src/basic/missing_syscall.h:65:19: error: static declaration of 'memfd_create' follows non-static declaration
static inline int memfd_create(const char *name, unsigned int flags) {
^~~~~~~~~~~~
.../usr/include/bits/mman-shared.h:46:5: note: previous declaration of 'memfd_create' was here
int memfd_create (const char *__name, unsigned int __flags) __THROW;
^~~~~~~~~~~~
To avoid this problem, call our inline functions different than glibc,
and use a #define to map the official name to our replacement.
Fixes #8099.
v2:
- use "missing_" as the prefix instead of "_"
v3:
- rebase and update for statx()
Unfortunately "statx" is also present in "struct statx", so the define
causes issues. Work around this by using a typedef.
I checked that systemd compiles with current glibc
(glibc-devel-2.26-24.fc27.x86_64) if HAVE_MEMFD_CREATE, HAVE_GETTID,
HAVE_PIVOT_ROOT, HAVE_SETNS, HAVE_RENAMEAT2, HAVE_KCMP, HAVE_KEYCTL,
HAVE_COPY_FILE_RANGE, HAVE_BPF, HAVE_STATX are forced to 0.
Setting HAVE_NAME_TO_HANDLE_AT to 0 causes an issue, but it's not because of
the define, but because of struct file_handle.
2018-02-21 14:04:50 +01:00
|
|
|
|
|
|
|
# define kcmp missing_kcmp
|
2016-03-17 18:26:13 +01:00
|
|
|
#endif
|
|
|
|
|
|
|
|
/* ======================================================================= */
|
|
|
|
|
2017-10-03 10:32:34 +02:00
|
|
|
#if !HAVE_KEYCTL
|
2018-12-06 06:32:41 +01:00
|
|
|
static inline long missing_keyctl(int cmd, unsigned long arg2, unsigned long arg3, unsigned long arg4, unsigned long arg5) {
|
2019-12-06 20:28:13 +01:00
|
|
|
# if defined __NR_keyctl && __NR_keyctl >= 0
|
2016-03-17 18:26:13 +01:00
|
|
|
return syscall(__NR_keyctl, cmd, arg2, arg3, arg4, arg5);
|
|
|
|
# else
|
|
|
|
errno = ENOSYS;
|
|
|
|
return -1;
|
|
|
|
# endif
|
missing_syscall: when adding syscall replacements, use different names (#8229)
In meson.build we check that functions are available using:
meson.get_compiler('c').has_function('foo')
which checks the following:
- if __stub_foo or __stub___foo are defined, return false
- if foo is declared (a pointer to the function can be taken), return true
- otherwise check for __builtin_memfd_create
_stub is documented by glibc as
It defines a symbol '__stub_FUNCTION' for each function
in the C library which is a stub, meaning it will fail
every time called, usually setting errno to ENOSYS.
So if __stub is defined, we know we don't want to use the glibc version, but
this doesn't tell us if the name itself is defined or not. If it _is_ defined,
and we define our replacement as an inline static function, we get an error:
In file included from ../src/basic/missing.h:1358:0,
from ../src/basic/util.h:47,
from ../src/basic/calendarspec.h:29,
from ../src/basic/calendarspec.c:34:
../src/basic/missing_syscall.h:65:19: error: static declaration of 'memfd_create' follows non-static declaration
static inline int memfd_create(const char *name, unsigned int flags) {
^~~~~~~~~~~~
.../usr/include/bits/mman-shared.h:46:5: note: previous declaration of 'memfd_create' was here
int memfd_create (const char *__name, unsigned int __flags) __THROW;
^~~~~~~~~~~~
To avoid this problem, call our inline functions different than glibc,
and use a #define to map the official name to our replacement.
Fixes #8099.
v2:
- use "missing_" as the prefix instead of "_"
v3:
- rebase and update for statx()
Unfortunately "statx" is also present in "struct statx", so the define
causes issues. Work around this by using a typedef.
I checked that systemd compiles with current glibc
(glibc-devel-2.26-24.fc27.x86_64) if HAVE_MEMFD_CREATE, HAVE_GETTID,
HAVE_PIVOT_ROOT, HAVE_SETNS, HAVE_RENAMEAT2, HAVE_KCMP, HAVE_KEYCTL,
HAVE_COPY_FILE_RANGE, HAVE_BPF, HAVE_STATX are forced to 0.
Setting HAVE_NAME_TO_HANDLE_AT to 0 causes an issue, but it's not because of
the define, but because of struct file_handle.
2018-02-21 14:04:50 +01:00
|
|
|
|
|
|
|
# define keyctl missing_keyctl
|
2016-03-17 18:26:13 +01:00
|
|
|
}
|
|
|
|
|
missing_syscall: when adding syscall replacements, use different names (#8229)
In meson.build we check that functions are available using:
meson.get_compiler('c').has_function('foo')
which checks the following:
- if __stub_foo or __stub___foo are defined, return false
- if foo is declared (a pointer to the function can be taken), return true
- otherwise check for __builtin_memfd_create
_stub is documented by glibc as
It defines a symbol '__stub_FUNCTION' for each function
in the C library which is a stub, meaning it will fail
every time called, usually setting errno to ENOSYS.
So if __stub is defined, we know we don't want to use the glibc version, but
this doesn't tell us if the name itself is defined or not. If it _is_ defined,
and we define our replacement as an inline static function, we get an error:
In file included from ../src/basic/missing.h:1358:0,
from ../src/basic/util.h:47,
from ../src/basic/calendarspec.h:29,
from ../src/basic/calendarspec.c:34:
../src/basic/missing_syscall.h:65:19: error: static declaration of 'memfd_create' follows non-static declaration
static inline int memfd_create(const char *name, unsigned int flags) {
^~~~~~~~~~~~
.../usr/include/bits/mman-shared.h:46:5: note: previous declaration of 'memfd_create' was here
int memfd_create (const char *__name, unsigned int __flags) __THROW;
^~~~~~~~~~~~
To avoid this problem, call our inline functions different than glibc,
and use a #define to map the official name to our replacement.
Fixes #8099.
v2:
- use "missing_" as the prefix instead of "_"
v3:
- rebase and update for statx()
Unfortunately "statx" is also present in "struct statx", so the define
causes issues. Work around this by using a typedef.
I checked that systemd compiles with current glibc
(glibc-devel-2.26-24.fc27.x86_64) if HAVE_MEMFD_CREATE, HAVE_GETTID,
HAVE_PIVOT_ROOT, HAVE_SETNS, HAVE_RENAMEAT2, HAVE_KCMP, HAVE_KEYCTL,
HAVE_COPY_FILE_RANGE, HAVE_BPF, HAVE_STATX are forced to 0.
Setting HAVE_NAME_TO_HANDLE_AT to 0 causes an issue, but it's not because of
the define, but because of struct file_handle.
2018-02-21 14:04:50 +01:00
|
|
|
static inline key_serial_t missing_add_key(const char *type, const char *description, const void *payload, size_t plen, key_serial_t ringid) {
|
2019-12-06 20:28:13 +01:00
|
|
|
# if defined __NR_add_key && __NR_add_key >= 0
|
2016-03-17 18:26:13 +01:00
|
|
|
return syscall(__NR_add_key, type, description, payload, plen, ringid);
|
|
|
|
# else
|
|
|
|
errno = ENOSYS;
|
|
|
|
return -1;
|
|
|
|
# endif
|
missing_syscall: when adding syscall replacements, use different names (#8229)
In meson.build we check that functions are available using:
meson.get_compiler('c').has_function('foo')
which checks the following:
- if __stub_foo or __stub___foo are defined, return false
- if foo is declared (a pointer to the function can be taken), return true
- otherwise check for __builtin_memfd_create
_stub is documented by glibc as
It defines a symbol '__stub_FUNCTION' for each function
in the C library which is a stub, meaning it will fail
every time called, usually setting errno to ENOSYS.
So if __stub is defined, we know we don't want to use the glibc version, but
this doesn't tell us if the name itself is defined or not. If it _is_ defined,
and we define our replacement as an inline static function, we get an error:
In file included from ../src/basic/missing.h:1358:0,
from ../src/basic/util.h:47,
from ../src/basic/calendarspec.h:29,
from ../src/basic/calendarspec.c:34:
../src/basic/missing_syscall.h:65:19: error: static declaration of 'memfd_create' follows non-static declaration
static inline int memfd_create(const char *name, unsigned int flags) {
^~~~~~~~~~~~
.../usr/include/bits/mman-shared.h:46:5: note: previous declaration of 'memfd_create' was here
int memfd_create (const char *__name, unsigned int __flags) __THROW;
^~~~~~~~~~~~
To avoid this problem, call our inline functions different than glibc,
and use a #define to map the official name to our replacement.
Fixes #8099.
v2:
- use "missing_" as the prefix instead of "_"
v3:
- rebase and update for statx()
Unfortunately "statx" is also present in "struct statx", so the define
causes issues. Work around this by using a typedef.
I checked that systemd compiles with current glibc
(glibc-devel-2.26-24.fc27.x86_64) if HAVE_MEMFD_CREATE, HAVE_GETTID,
HAVE_PIVOT_ROOT, HAVE_SETNS, HAVE_RENAMEAT2, HAVE_KCMP, HAVE_KEYCTL,
HAVE_COPY_FILE_RANGE, HAVE_BPF, HAVE_STATX are forced to 0.
Setting HAVE_NAME_TO_HANDLE_AT to 0 causes an issue, but it's not because of
the define, but because of struct file_handle.
2018-02-21 14:04:50 +01:00
|
|
|
|
|
|
|
# define add_key missing_add_key
|
2016-03-17 18:26:13 +01:00
|
|
|
}
|
|
|
|
|
missing_syscall: when adding syscall replacements, use different names (#8229)
In meson.build we check that functions are available using:
meson.get_compiler('c').has_function('foo')
which checks the following:
- if __stub_foo or __stub___foo are defined, return false
- if foo is declared (a pointer to the function can be taken), return true
- otherwise check for __builtin_memfd_create
_stub is documented by glibc as
It defines a symbol '__stub_FUNCTION' for each function
in the C library which is a stub, meaning it will fail
every time called, usually setting errno to ENOSYS.
So if __stub is defined, we know we don't want to use the glibc version, but
this doesn't tell us if the name itself is defined or not. If it _is_ defined,
and we define our replacement as an inline static function, we get an error:
In file included from ../src/basic/missing.h:1358:0,
from ../src/basic/util.h:47,
from ../src/basic/calendarspec.h:29,
from ../src/basic/calendarspec.c:34:
../src/basic/missing_syscall.h:65:19: error: static declaration of 'memfd_create' follows non-static declaration
static inline int memfd_create(const char *name, unsigned int flags) {
^~~~~~~~~~~~
.../usr/include/bits/mman-shared.h:46:5: note: previous declaration of 'memfd_create' was here
int memfd_create (const char *__name, unsigned int __flags) __THROW;
^~~~~~~~~~~~
To avoid this problem, call our inline functions different than glibc,
and use a #define to map the official name to our replacement.
Fixes #8099.
v2:
- use "missing_" as the prefix instead of "_"
v3:
- rebase and update for statx()
Unfortunately "statx" is also present in "struct statx", so the define
causes issues. Work around this by using a typedef.
I checked that systemd compiles with current glibc
(glibc-devel-2.26-24.fc27.x86_64) if HAVE_MEMFD_CREATE, HAVE_GETTID,
HAVE_PIVOT_ROOT, HAVE_SETNS, HAVE_RENAMEAT2, HAVE_KCMP, HAVE_KEYCTL,
HAVE_COPY_FILE_RANGE, HAVE_BPF, HAVE_STATX are forced to 0.
Setting HAVE_NAME_TO_HANDLE_AT to 0 causes an issue, but it's not because of
the define, but because of struct file_handle.
2018-02-21 14:04:50 +01:00
|
|
|
static inline key_serial_t missing_request_key(const char *type, const char *description, const char * callout_info, key_serial_t destringid) {
|
2019-12-06 20:28:13 +01:00
|
|
|
# if defined __NR_request_key && __NR_request_key >= 0
|
2016-03-17 18:26:13 +01:00
|
|
|
return syscall(__NR_request_key, type, description, callout_info, destringid);
|
|
|
|
# else
|
|
|
|
errno = ENOSYS;
|
|
|
|
return -1;
|
|
|
|
# endif
|
missing_syscall: when adding syscall replacements, use different names (#8229)
In meson.build we check that functions are available using:
meson.get_compiler('c').has_function('foo')
which checks the following:
- if __stub_foo or __stub___foo are defined, return false
- if foo is declared (a pointer to the function can be taken), return true
- otherwise check for __builtin_memfd_create
_stub is documented by glibc as
It defines a symbol '__stub_FUNCTION' for each function
in the C library which is a stub, meaning it will fail
every time called, usually setting errno to ENOSYS.
So if __stub is defined, we know we don't want to use the glibc version, but
this doesn't tell us if the name itself is defined or not. If it _is_ defined,
and we define our replacement as an inline static function, we get an error:
In file included from ../src/basic/missing.h:1358:0,
from ../src/basic/util.h:47,
from ../src/basic/calendarspec.h:29,
from ../src/basic/calendarspec.c:34:
../src/basic/missing_syscall.h:65:19: error: static declaration of 'memfd_create' follows non-static declaration
static inline int memfd_create(const char *name, unsigned int flags) {
^~~~~~~~~~~~
.../usr/include/bits/mman-shared.h:46:5: note: previous declaration of 'memfd_create' was here
int memfd_create (const char *__name, unsigned int __flags) __THROW;
^~~~~~~~~~~~
To avoid this problem, call our inline functions different than glibc,
and use a #define to map the official name to our replacement.
Fixes #8099.
v2:
- use "missing_" as the prefix instead of "_"
v3:
- rebase and update for statx()
Unfortunately "statx" is also present in "struct statx", so the define
causes issues. Work around this by using a typedef.
I checked that systemd compiles with current glibc
(glibc-devel-2.26-24.fc27.x86_64) if HAVE_MEMFD_CREATE, HAVE_GETTID,
HAVE_PIVOT_ROOT, HAVE_SETNS, HAVE_RENAMEAT2, HAVE_KCMP, HAVE_KEYCTL,
HAVE_COPY_FILE_RANGE, HAVE_BPF, HAVE_STATX are forced to 0.
Setting HAVE_NAME_TO_HANDLE_AT to 0 causes an issue, but it's not because of
the define, but because of struct file_handle.
2018-02-21 14:04:50 +01:00
|
|
|
|
|
|
|
# define request_key missing_request_key
|
2016-03-17 18:26:13 +01:00
|
|
|
}
|
|
|
|
#endif
|
|
|
|
|
|
|
|
/* ======================================================================= */
|
|
|
|
|
2020-12-07 05:32:04 +01:00
|
|
|
#if defined(__aarch64__)
|
2020-08-18 09:22:20 +02:00
|
|
|
# define systemd_NR_copy_file_range 285
|
2020-12-07 05:32:04 +01:00
|
|
|
#elif defined(__alpha__)
|
2020-12-07 00:45:49 +01:00
|
|
|
# define systemd_NR_copy_file_range 519
|
2020-12-08 06:59:45 +01:00
|
|
|
#elif defined(__arc__) || defined(__tilegx__)
|
2020-08-18 09:22:20 +02:00
|
|
|
# define systemd_NR_copy_file_range 285
|
2020-12-07 05:32:04 +01:00
|
|
|
#elif defined(__arm__)
|
|
|
|
# define systemd_NR_copy_file_range 391
|
|
|
|
#elif defined(__i386__)
|
|
|
|
# define systemd_NR_copy_file_range 377
|
2020-12-08 06:59:45 +01:00
|
|
|
#elif defined(__ia64__)
|
|
|
|
# define systemd_NR_copy_file_range systemd_SC_arch_bias(323)
|
|
|
|
#elif defined(__m68k__)
|
|
|
|
# define systemd_NR_copy_file_range 376
|
2020-12-07 05:32:04 +01:00
|
|
|
#elif defined(_MIPS_SIM)
|
2020-11-13 06:58:49 +01:00
|
|
|
# if _MIPS_SIM == _MIPS_SIM_ABI32
|
|
|
|
# define systemd_NR_copy_file_range systemd_SC_arch_bias(360)
|
|
|
|
# elif _MIPS_SIM == _MIPS_SIM_NABI32
|
|
|
|
# define systemd_NR_copy_file_range systemd_SC_arch_bias(324)
|
|
|
|
# elif _MIPS_SIM == _MIPS_SIM_ABI64
|
|
|
|
# define systemd_NR_copy_file_range systemd_SC_arch_bias(320)
|
|
|
|
# endif
|
2020-12-07 05:32:04 +01:00
|
|
|
#elif defined(__powerpc__)
|
|
|
|
# define systemd_NR_copy_file_range 379
|
|
|
|
#elif defined(__s390__)
|
|
|
|
# define systemd_NR_copy_file_range 375
|
2020-12-08 06:59:45 +01:00
|
|
|
#elif defined(__sparc__)
|
|
|
|
# define systemd_NR_copy_file_range 357
|
2020-12-07 05:32:04 +01:00
|
|
|
#elif defined(__x86_64__)
|
|
|
|
# define systemd_NR_copy_file_range systemd_SC_arch_bias(326)
|
2020-08-18 09:22:20 +02:00
|
|
|
#else
|
2020-12-08 07:35:57 +01:00
|
|
|
# warning "copy_file_range() syscall number is unknown for your architecture"
|
2020-08-18 09:22:20 +02:00
|
|
|
#endif
|
|
|
|
|
2019-08-15 03:08:36 +02:00
|
|
|
/* may be (invalid) negative number due to libseccomp, see PR 13319 */
|
2020-08-18 09:22:20 +02:00
|
|
|
#if defined __NR_copy_file_range && __NR_copy_file_range >= 0
|
|
|
|
# if defined systemd_NR_copy_file_range
|
|
|
|
assert_cc(__NR_copy_file_range == systemd_NR_copy_file_range);
|
2016-03-17 18:26:13 +01:00
|
|
|
# endif
|
2020-08-18 09:22:20 +02:00
|
|
|
#else
|
|
|
|
# if defined __NR_copy_file_range
|
|
|
|
# undef __NR_copy_file_range
|
|
|
|
# endif
|
|
|
|
# if defined systemd_NR_copy_file_range
|
|
|
|
# define __NR_copy_file_range systemd_NR_copy_file_range
|
|
|
|
# endif
|
|
|
|
#endif
|
2016-03-17 18:26:13 +01:00
|
|
|
|
2020-08-18 09:22:20 +02:00
|
|
|
#if !HAVE_COPY_FILE_RANGE
|
missing_syscall: when adding syscall replacements, use different names (#8229)
In meson.build we check that functions are available using:
meson.get_compiler('c').has_function('foo')
which checks the following:
- if __stub_foo or __stub___foo are defined, return false
- if foo is declared (a pointer to the function can be taken), return true
- otherwise check for __builtin_memfd_create
_stub is documented by glibc as
It defines a symbol '__stub_FUNCTION' for each function
in the C library which is a stub, meaning it will fail
every time called, usually setting errno to ENOSYS.
So if __stub is defined, we know we don't want to use the glibc version, but
this doesn't tell us if the name itself is defined or not. If it _is_ defined,
and we define our replacement as an inline static function, we get an error:
In file included from ../src/basic/missing.h:1358:0,
from ../src/basic/util.h:47,
from ../src/basic/calendarspec.h:29,
from ../src/basic/calendarspec.c:34:
../src/basic/missing_syscall.h:65:19: error: static declaration of 'memfd_create' follows non-static declaration
static inline int memfd_create(const char *name, unsigned int flags) {
^~~~~~~~~~~~
.../usr/include/bits/mman-shared.h:46:5: note: previous declaration of 'memfd_create' was here
int memfd_create (const char *__name, unsigned int __flags) __THROW;
^~~~~~~~~~~~
To avoid this problem, call our inline functions different than glibc,
and use a #define to map the official name to our replacement.
Fixes #8099.
v2:
- use "missing_" as the prefix instead of "_"
v3:
- rebase and update for statx()
Unfortunately "statx" is also present in "struct statx", so the define
causes issues. Work around this by using a typedef.
I checked that systemd compiles with current glibc
(glibc-devel-2.26-24.fc27.x86_64) if HAVE_MEMFD_CREATE, HAVE_GETTID,
HAVE_PIVOT_ROOT, HAVE_SETNS, HAVE_RENAMEAT2, HAVE_KCMP, HAVE_KEYCTL,
HAVE_COPY_FILE_RANGE, HAVE_BPF, HAVE_STATX are forced to 0.
Setting HAVE_NAME_TO_HANDLE_AT to 0 causes an issue, but it's not because of
the define, but because of struct file_handle.
2018-02-21 14:04:50 +01:00
|
|
|
static inline ssize_t missing_copy_file_range(int fd_in, loff_t *off_in,
|
|
|
|
int fd_out, loff_t *off_out,
|
|
|
|
size_t len,
|
|
|
|
unsigned int flags) {
|
2016-03-17 18:26:13 +01:00
|
|
|
# ifdef __NR_copy_file_range
|
|
|
|
return syscall(__NR_copy_file_range, fd_in, off_in, fd_out, off_out, len, flags);
|
|
|
|
# else
|
|
|
|
errno = ENOSYS;
|
|
|
|
return -1;
|
|
|
|
# endif
|
|
|
|
}
|
missing_syscall: when adding syscall replacements, use different names (#8229)
In meson.build we check that functions are available using:
meson.get_compiler('c').has_function('foo')
which checks the following:
- if __stub_foo or __stub___foo are defined, return false
- if foo is declared (a pointer to the function can be taken), return true
- otherwise check for __builtin_memfd_create
_stub is documented by glibc as
It defines a symbol '__stub_FUNCTION' for each function
in the C library which is a stub, meaning it will fail
every time called, usually setting errno to ENOSYS.
So if __stub is defined, we know we don't want to use the glibc version, but
this doesn't tell us if the name itself is defined or not. If it _is_ defined,
and we define our replacement as an inline static function, we get an error:
In file included from ../src/basic/missing.h:1358:0,
from ../src/basic/util.h:47,
from ../src/basic/calendarspec.h:29,
from ../src/basic/calendarspec.c:34:
../src/basic/missing_syscall.h:65:19: error: static declaration of 'memfd_create' follows non-static declaration
static inline int memfd_create(const char *name, unsigned int flags) {
^~~~~~~~~~~~
.../usr/include/bits/mman-shared.h:46:5: note: previous declaration of 'memfd_create' was here
int memfd_create (const char *__name, unsigned int __flags) __THROW;
^~~~~~~~~~~~
To avoid this problem, call our inline functions different than glibc,
and use a #define to map the official name to our replacement.
Fixes #8099.
v2:
- use "missing_" as the prefix instead of "_"
v3:
- rebase and update for statx()
Unfortunately "statx" is also present in "struct statx", so the define
causes issues. Work around this by using a typedef.
I checked that systemd compiles with current glibc
(glibc-devel-2.26-24.fc27.x86_64) if HAVE_MEMFD_CREATE, HAVE_GETTID,
HAVE_PIVOT_ROOT, HAVE_SETNS, HAVE_RENAMEAT2, HAVE_KCMP, HAVE_KEYCTL,
HAVE_COPY_FILE_RANGE, HAVE_BPF, HAVE_STATX are forced to 0.
Setting HAVE_NAME_TO_HANDLE_AT to 0 causes an issue, but it's not because of
the define, but because of struct file_handle.
2018-02-21 14:04:50 +01:00
|
|
|
|
|
|
|
# define copy_file_range missing_copy_file_range
|
2016-03-17 18:26:13 +01:00
|
|
|
#endif
|
2016-10-18 17:57:10 +02:00
|
|
|
|
2017-11-13 09:27:53 +01:00
|
|
|
/* ======================================================================= */
|
|
|
|
|
2020-12-07 05:32:04 +01:00
|
|
|
#if defined(__aarch64__)
|
2020-08-18 09:22:20 +02:00
|
|
|
# define systemd_NR_bpf 280
|
2020-12-07 05:32:04 +01:00
|
|
|
#elif defined(__alpha__)
|
2020-12-07 00:45:49 +01:00
|
|
|
# define systemd_NR_bpf 515
|
2020-12-08 06:59:45 +01:00
|
|
|
#elif defined(__arc__) || defined(__tilegx__)
|
|
|
|
# define systemd_NR_bpf 280
|
2020-12-07 05:32:04 +01:00
|
|
|
#elif defined(__arm__)
|
|
|
|
# define systemd_NR_bpf 386
|
|
|
|
#elif defined(__i386__)
|
|
|
|
# define systemd_NR_bpf 357
|
2020-12-08 06:59:45 +01:00
|
|
|
#elif defined(__ia64__)
|
|
|
|
# define systemd_NR_bpf systemd_SC_arch_bias(317)
|
|
|
|
#elif defined(__m68k__)
|
|
|
|
# define systemd_NR_bpf 354
|
2020-12-07 05:32:04 +01:00
|
|
|
#elif defined(_MIPS_SIM)
|
2020-11-13 06:58:49 +01:00
|
|
|
# if _MIPS_SIM == _MIPS_SIM_ABI32
|
|
|
|
# define systemd_NR_bpf systemd_SC_arch_bias(355)
|
|
|
|
# elif _MIPS_SIM == _MIPS_SIM_NABI32
|
|
|
|
# define systemd_NR_bpf systemd_SC_arch_bias(319)
|
|
|
|
# elif _MIPS_SIM == _MIPS_SIM_ABI64
|
|
|
|
# define systemd_NR_bpf systemd_SC_arch_bias(315)
|
|
|
|
# endif
|
2020-12-07 05:32:04 +01:00
|
|
|
#elif defined(__powerpc__)
|
|
|
|
# define systemd_NR_bpf 361
|
|
|
|
#elif defined(__s390__)
|
|
|
|
# define systemd_NR_bpf 351
|
|
|
|
#elif defined(__sparc__)
|
|
|
|
# define systemd_NR_bpf 349
|
|
|
|
#elif defined(__x86_64__)
|
|
|
|
# define systemd_NR_bpf systemd_SC_arch_bias(321)
|
2020-08-18 09:22:20 +02:00
|
|
|
#else
|
2020-12-08 07:35:57 +01:00
|
|
|
# warning "bpf() syscall number is unknown for your architecture"
|
2020-08-18 09:22:20 +02:00
|
|
|
#endif
|
|
|
|
|
2019-08-15 03:08:36 +02:00
|
|
|
/* may be (invalid) negative number due to libseccomp, see PR 13319 */
|
2020-08-18 09:22:20 +02:00
|
|
|
#if defined __NR_bpf && __NR_bpf >= 0
|
|
|
|
# if defined systemd_NR_bpf
|
|
|
|
assert_cc(__NR_bpf == systemd_NR_bpf);
|
|
|
|
# endif
|
|
|
|
#else
|
|
|
|
# if defined __NR_bpf
|
|
|
|
# undef __NR_bpf
|
2016-10-18 17:57:10 +02:00
|
|
|
# endif
|
2020-08-18 09:22:20 +02:00
|
|
|
# if defined systemd_NR_bpf
|
|
|
|
# define __NR_bpf systemd_NR_bpf
|
|
|
|
# endif
|
|
|
|
#endif
|
2016-10-18 17:57:10 +02:00
|
|
|
|
2020-08-18 09:22:20 +02:00
|
|
|
#if !HAVE_BPF
|
2016-10-18 17:57:10 +02:00
|
|
|
union bpf_attr;
|
|
|
|
|
missing_syscall: when adding syscall replacements, use different names (#8229)
In meson.build we check that functions are available using:
meson.get_compiler('c').has_function('foo')
which checks the following:
- if __stub_foo or __stub___foo are defined, return false
- if foo is declared (a pointer to the function can be taken), return true
- otherwise check for __builtin_memfd_create
_stub is documented by glibc as
It defines a symbol '__stub_FUNCTION' for each function
in the C library which is a stub, meaning it will fail
every time called, usually setting errno to ENOSYS.
So if __stub is defined, we know we don't want to use the glibc version, but
this doesn't tell us if the name itself is defined or not. If it _is_ defined,
and we define our replacement as an inline static function, we get an error:
In file included from ../src/basic/missing.h:1358:0,
from ../src/basic/util.h:47,
from ../src/basic/calendarspec.h:29,
from ../src/basic/calendarspec.c:34:
../src/basic/missing_syscall.h:65:19: error: static declaration of 'memfd_create' follows non-static declaration
static inline int memfd_create(const char *name, unsigned int flags) {
^~~~~~~~~~~~
.../usr/include/bits/mman-shared.h:46:5: note: previous declaration of 'memfd_create' was here
int memfd_create (const char *__name, unsigned int __flags) __THROW;
^~~~~~~~~~~~
To avoid this problem, call our inline functions different than glibc,
and use a #define to map the official name to our replacement.
Fixes #8099.
v2:
- use "missing_" as the prefix instead of "_"
v3:
- rebase and update for statx()
Unfortunately "statx" is also present in "struct statx", so the define
causes issues. Work around this by using a typedef.
I checked that systemd compiles with current glibc
(glibc-devel-2.26-24.fc27.x86_64) if HAVE_MEMFD_CREATE, HAVE_GETTID,
HAVE_PIVOT_ROOT, HAVE_SETNS, HAVE_RENAMEAT2, HAVE_KCMP, HAVE_KEYCTL,
HAVE_COPY_FILE_RANGE, HAVE_BPF, HAVE_STATX are forced to 0.
Setting HAVE_NAME_TO_HANDLE_AT to 0 causes an issue, but it's not because of
the define, but because of struct file_handle.
2018-02-21 14:04:50 +01:00
|
|
|
static inline int missing_bpf(int cmd, union bpf_attr *attr, size_t size) {
|
2016-10-18 17:57:10 +02:00
|
|
|
#ifdef __NR_bpf
|
|
|
|
return (int) syscall(__NR_bpf, cmd, attr, size);
|
|
|
|
#else
|
|
|
|
errno = ENOSYS;
|
|
|
|
return -1;
|
|
|
|
#endif
|
|
|
|
}
|
|
|
|
|
missing_syscall: when adding syscall replacements, use different names (#8229)
In meson.build we check that functions are available using:
meson.get_compiler('c').has_function('foo')
which checks the following:
- if __stub_foo or __stub___foo are defined, return false
- if foo is declared (a pointer to the function can be taken), return true
- otherwise check for __builtin_memfd_create
_stub is documented by glibc as
It defines a symbol '__stub_FUNCTION' for each function
in the C library which is a stub, meaning it will fail
every time called, usually setting errno to ENOSYS.
So if __stub is defined, we know we don't want to use the glibc version, but
this doesn't tell us if the name itself is defined or not. If it _is_ defined,
and we define our replacement as an inline static function, we get an error:
In file included from ../src/basic/missing.h:1358:0,
from ../src/basic/util.h:47,
from ../src/basic/calendarspec.h:29,
from ../src/basic/calendarspec.c:34:
../src/basic/missing_syscall.h:65:19: error: static declaration of 'memfd_create' follows non-static declaration
static inline int memfd_create(const char *name, unsigned int flags) {
^~~~~~~~~~~~
.../usr/include/bits/mman-shared.h:46:5: note: previous declaration of 'memfd_create' was here
int memfd_create (const char *__name, unsigned int __flags) __THROW;
^~~~~~~~~~~~
To avoid this problem, call our inline functions different than glibc,
and use a #define to map the official name to our replacement.
Fixes #8099.
v2:
- use "missing_" as the prefix instead of "_"
v3:
- rebase and update for statx()
Unfortunately "statx" is also present in "struct statx", so the define
causes issues. Work around this by using a typedef.
I checked that systemd compiles with current glibc
(glibc-devel-2.26-24.fc27.x86_64) if HAVE_MEMFD_CREATE, HAVE_GETTID,
HAVE_PIVOT_ROOT, HAVE_SETNS, HAVE_RENAMEAT2, HAVE_KCMP, HAVE_KEYCTL,
HAVE_COPY_FILE_RANGE, HAVE_BPF, HAVE_STATX are forced to 0.
Setting HAVE_NAME_TO_HANDLE_AT to 0 causes an issue, but it's not because of
the define, but because of struct file_handle.
2018-02-21 14:04:50 +01:00
|
|
|
# define bpf missing_bpf
|
2016-10-18 17:57:10 +02:00
|
|
|
#endif
|
2017-11-13 09:27:53 +01:00
|
|
|
|
|
|
|
/* ======================================================================= */
|
|
|
|
|
|
|
|
#ifndef __IGNORE_pkey_mprotect
|
2020-12-07 05:32:04 +01:00
|
|
|
# if defined(__aarch64__)
|
2020-08-22 16:55:56 +02:00
|
|
|
# define systemd_NR_pkey_mprotect 288
|
2020-12-07 05:32:04 +01:00
|
|
|
# elif defined(__alpha__)
|
2020-12-07 00:45:49 +01:00
|
|
|
# define systemd_NR_pkey_mprotect 524
|
2020-12-08 06:59:45 +01:00
|
|
|
# elif defined(__arc__) || defined(__tilegx__)
|
|
|
|
# define systemd_NR_pkey_mprotect 226
|
2020-12-07 05:32:04 +01:00
|
|
|
# elif defined(__arm__)
|
|
|
|
# define systemd_NR_pkey_mprotect 394
|
|
|
|
# elif defined(__i386__)
|
|
|
|
# define systemd_NR_pkey_mprotect 380
|
2020-12-08 06:59:45 +01:00
|
|
|
# elif defined(__ia64__)
|
|
|
|
# define systemd_NR_pkey_mprotect systemd_SC_arch_bias(330)
|
|
|
|
# elif defined(__m68k__)
|
|
|
|
# define systemd_NR_pkey_mprotect 381
|
2020-12-07 05:32:04 +01:00
|
|
|
# elif defined(_MIPS_SIM)
|
2020-08-18 09:22:20 +02:00
|
|
|
# if _MIPS_SIM == _MIPS_SIM_ABI32
|
2020-11-13 06:58:49 +01:00
|
|
|
# define systemd_NR_pkey_mprotect systemd_SC_arch_bias(363)
|
|
|
|
# elif _MIPS_SIM == _MIPS_SIM_NABI32
|
|
|
|
# define systemd_NR_pkey_mprotect systemd_SC_arch_bias(327)
|
|
|
|
# elif _MIPS_SIM == _MIPS_SIM_ABI64
|
|
|
|
# define systemd_NR_pkey_mprotect systemd_SC_arch_bias(323)
|
2020-08-18 09:22:20 +02:00
|
|
|
# endif
|
2020-12-07 05:32:04 +01:00
|
|
|
# elif defined(__powerpc__)
|
|
|
|
# define systemd_NR_pkey_mprotect 386
|
|
|
|
# elif defined(__s390__)
|
|
|
|
# define systemd_NR_pkey_mprotect 384
|
2020-12-08 06:59:45 +01:00
|
|
|
# elif defined(__sparc__)
|
|
|
|
# define systemd_NR_pkey_mprotect 362
|
2020-12-07 05:32:04 +01:00
|
|
|
# elif defined(__x86_64__)
|
|
|
|
# define systemd_NR_pkey_mprotect systemd_SC_arch_bias(329)
|
2020-08-18 09:22:20 +02:00
|
|
|
# else
|
2020-12-08 07:35:57 +01:00
|
|
|
# warning "pkey_mprotect() syscall number is unknown for your architecture"
|
2020-08-18 09:22:20 +02:00
|
|
|
# endif
|
|
|
|
|
2019-08-15 03:08:36 +02:00
|
|
|
/* may be (invalid) negative number due to libseccomp, see PR 13319 */
|
2020-08-18 09:22:20 +02:00
|
|
|
# if defined __NR_pkey_mprotect && __NR_pkey_mprotect >= 0
|
|
|
|
# if defined systemd_NR_pkey_mprotect
|
|
|
|
assert_cc(__NR_pkey_mprotect == systemd_NR_pkey_mprotect);
|
|
|
|
# endif
|
|
|
|
# else
|
2019-07-25 13:57:30 +02:00
|
|
|
# if defined __NR_pkey_mprotect
|
|
|
|
# undef __NR_pkey_mprotect
|
|
|
|
# endif
|
2020-08-18 09:22:20 +02:00
|
|
|
# if defined systemd_NR_pkey_mprotect
|
|
|
|
# define __NR_pkey_mprotect systemd_NR_pkey_mprotect
|
2017-11-13 09:27:53 +01:00
|
|
|
# endif
|
|
|
|
# endif
|
|
|
|
#endif
|
2018-02-20 12:48:33 +01:00
|
|
|
|
missing_syscall: when adding syscall replacements, use different names (#8229)
In meson.build we check that functions are available using:
meson.get_compiler('c').has_function('foo')
which checks the following:
- if __stub_foo or __stub___foo are defined, return false
- if foo is declared (a pointer to the function can be taken), return true
- otherwise check for __builtin_memfd_create
_stub is documented by glibc as
It defines a symbol '__stub_FUNCTION' for each function
in the C library which is a stub, meaning it will fail
every time called, usually setting errno to ENOSYS.
So if __stub is defined, we know we don't want to use the glibc version, but
this doesn't tell us if the name itself is defined or not. If it _is_ defined,
and we define our replacement as an inline static function, we get an error:
In file included from ../src/basic/missing.h:1358:0,
from ../src/basic/util.h:47,
from ../src/basic/calendarspec.h:29,
from ../src/basic/calendarspec.c:34:
../src/basic/missing_syscall.h:65:19: error: static declaration of 'memfd_create' follows non-static declaration
static inline int memfd_create(const char *name, unsigned int flags) {
^~~~~~~~~~~~
.../usr/include/bits/mman-shared.h:46:5: note: previous declaration of 'memfd_create' was here
int memfd_create (const char *__name, unsigned int __flags) __THROW;
^~~~~~~~~~~~
To avoid this problem, call our inline functions different than glibc,
and use a #define to map the official name to our replacement.
Fixes #8099.
v2:
- use "missing_" as the prefix instead of "_"
v3:
- rebase and update for statx()
Unfortunately "statx" is also present in "struct statx", so the define
causes issues. Work around this by using a typedef.
I checked that systemd compiles with current glibc
(glibc-devel-2.26-24.fc27.x86_64) if HAVE_MEMFD_CREATE, HAVE_GETTID,
HAVE_PIVOT_ROOT, HAVE_SETNS, HAVE_RENAMEAT2, HAVE_KCMP, HAVE_KEYCTL,
HAVE_COPY_FILE_RANGE, HAVE_BPF, HAVE_STATX are forced to 0.
Setting HAVE_NAME_TO_HANDLE_AT to 0 causes an issue, but it's not because of
the define, but because of struct file_handle.
2018-02-21 14:04:50 +01:00
|
|
|
/* ======================================================================= */
|
|
|
|
|
2020-12-07 05:32:04 +01:00
|
|
|
#if defined(__aarch64__)
|
2020-08-22 16:55:56 +02:00
|
|
|
# define systemd_NR_statx 291
|
2020-12-07 05:32:04 +01:00
|
|
|
#elif defined(__alpha__)
|
2020-08-18 09:22:20 +02:00
|
|
|
# define systemd_NR_statx 522
|
2020-12-08 06:59:45 +01:00
|
|
|
#elif defined(__arc__) || defined(__tilegx__)
|
|
|
|
# define systemd_NR_statx 291
|
2020-12-07 05:32:04 +01:00
|
|
|
#elif defined(__arm__)
|
|
|
|
# define systemd_NR_statx 397
|
|
|
|
#elif defined(__i386__)
|
2020-08-18 09:22:20 +02:00
|
|
|
# define systemd_NR_statx 383
|
2020-12-08 06:59:45 +01:00
|
|
|
#elif defined(__ia64__)
|
|
|
|
# define systemd_NR_statx systemd_SC_arch_bias(326)
|
|
|
|
#elif defined(__m68k__)
|
|
|
|
# define systemd_NR_statx 379
|
2020-12-07 05:32:04 +01:00
|
|
|
#elif defined(_MIPS_SIM)
|
2020-11-13 06:58:49 +01:00
|
|
|
# if _MIPS_SIM == _MIPS_SIM_ABI32
|
|
|
|
# define systemd_NR_statx systemd_SC_arch_bias(366)
|
|
|
|
# elif _MIPS_SIM == _MIPS_SIM_NABI32
|
|
|
|
# define systemd_NR_statx systemd_SC_arch_bias(330)
|
|
|
|
# elif _MIPS_SIM == _MIPS_SIM_ABI64
|
|
|
|
# define systemd_NR_statx systemd_SC_arch_bias(326)
|
|
|
|
# endif
|
2020-12-08 06:51:58 +01:00
|
|
|
#elif defined(__powerpc__)
|
2020-12-07 05:32:04 +01:00
|
|
|
# define systemd_NR_statx 383
|
2020-12-08 06:54:20 +01:00
|
|
|
#elif defined(__s390__)
|
2020-12-07 05:32:04 +01:00
|
|
|
# define systemd_NR_statx 379
|
|
|
|
#elif defined(__sparc__)
|
|
|
|
# define systemd_NR_statx 360
|
|
|
|
#elif defined(__x86_64__)
|
|
|
|
# define systemd_NR_statx systemd_SC_arch_bias(332)
|
2020-08-18 09:22:20 +02:00
|
|
|
#else
|
2020-12-08 07:35:57 +01:00
|
|
|
# warning "statx() syscall number is unknown for your architecture"
|
2020-08-18 09:22:20 +02:00
|
|
|
#endif
|
|
|
|
|
2019-08-15 03:08:36 +02:00
|
|
|
/* may be (invalid) negative number due to libseccomp, see PR 13319 */
|
2020-08-18 09:22:20 +02:00
|
|
|
#if defined __NR_statx && __NR_statx >= 0
|
|
|
|
# if defined systemd_NR_statx
|
|
|
|
assert_cc(__NR_statx == systemd_NR_statx);
|
|
|
|
# endif
|
|
|
|
#else
|
|
|
|
# if defined __NR_statx
|
|
|
|
# undef __NR_statx
|
|
|
|
# endif
|
|
|
|
# if defined systemd_NR_statx
|
|
|
|
# define __NR_statx systemd_NR_statx
|
2018-02-20 12:48:33 +01:00
|
|
|
# endif
|
missing_syscall: when adding syscall replacements, use different names (#8229)
In meson.build we check that functions are available using:
meson.get_compiler('c').has_function('foo')
which checks the following:
- if __stub_foo or __stub___foo are defined, return false
- if foo is declared (a pointer to the function can be taken), return true
- otherwise check for __builtin_memfd_create
_stub is documented by glibc as
It defines a symbol '__stub_FUNCTION' for each function
in the C library which is a stub, meaning it will fail
every time called, usually setting errno to ENOSYS.
So if __stub is defined, we know we don't want to use the glibc version, but
this doesn't tell us if the name itself is defined or not. If it _is_ defined,
and we define our replacement as an inline static function, we get an error:
In file included from ../src/basic/missing.h:1358:0,
from ../src/basic/util.h:47,
from ../src/basic/calendarspec.h:29,
from ../src/basic/calendarspec.c:34:
../src/basic/missing_syscall.h:65:19: error: static declaration of 'memfd_create' follows non-static declaration
static inline int memfd_create(const char *name, unsigned int flags) {
^~~~~~~~~~~~
.../usr/include/bits/mman-shared.h:46:5: note: previous declaration of 'memfd_create' was here
int memfd_create (const char *__name, unsigned int __flags) __THROW;
^~~~~~~~~~~~
To avoid this problem, call our inline functions different than glibc,
and use a #define to map the official name to our replacement.
Fixes #8099.
v2:
- use "missing_" as the prefix instead of "_"
v3:
- rebase and update for statx()
Unfortunately "statx" is also present in "struct statx", so the define
causes issues. Work around this by using a typedef.
I checked that systemd compiles with current glibc
(glibc-devel-2.26-24.fc27.x86_64) if HAVE_MEMFD_CREATE, HAVE_GETTID,
HAVE_PIVOT_ROOT, HAVE_SETNS, HAVE_RENAMEAT2, HAVE_KCMP, HAVE_KEYCTL,
HAVE_COPY_FILE_RANGE, HAVE_BPF, HAVE_STATX are forced to 0.
Setting HAVE_NAME_TO_HANDLE_AT to 0 causes an issue, but it's not because of
the define, but because of struct file_handle.
2018-02-21 14:04:50 +01:00
|
|
|
#endif
|
|
|
|
|
|
|
|
#if !HAVE_STATX
|
2020-08-18 09:22:20 +02:00
|
|
|
struct statx;
|
|
|
|
|
missing_syscall: when adding syscall replacements, use different names (#8229)
In meson.build we check that functions are available using:
meson.get_compiler('c').has_function('foo')
which checks the following:
- if __stub_foo or __stub___foo are defined, return false
- if foo is declared (a pointer to the function can be taken), return true
- otherwise check for __builtin_memfd_create
_stub is documented by glibc as
It defines a symbol '__stub_FUNCTION' for each function
in the C library which is a stub, meaning it will fail
every time called, usually setting errno to ENOSYS.
So if __stub is defined, we know we don't want to use the glibc version, but
this doesn't tell us if the name itself is defined or not. If it _is_ defined,
and we define our replacement as an inline static function, we get an error:
In file included from ../src/basic/missing.h:1358:0,
from ../src/basic/util.h:47,
from ../src/basic/calendarspec.h:29,
from ../src/basic/calendarspec.c:34:
../src/basic/missing_syscall.h:65:19: error: static declaration of 'memfd_create' follows non-static declaration
static inline int memfd_create(const char *name, unsigned int flags) {
^~~~~~~~~~~~
.../usr/include/bits/mman-shared.h:46:5: note: previous declaration of 'memfd_create' was here
int memfd_create (const char *__name, unsigned int __flags) __THROW;
^~~~~~~~~~~~
To avoid this problem, call our inline functions different than glibc,
and use a #define to map the official name to our replacement.
Fixes #8099.
v2:
- use "missing_" as the prefix instead of "_"
v3:
- rebase and update for statx()
Unfortunately "statx" is also present in "struct statx", so the define
causes issues. Work around this by using a typedef.
I checked that systemd compiles with current glibc
(glibc-devel-2.26-24.fc27.x86_64) if HAVE_MEMFD_CREATE, HAVE_GETTID,
HAVE_PIVOT_ROOT, HAVE_SETNS, HAVE_RENAMEAT2, HAVE_KCMP, HAVE_KEYCTL,
HAVE_COPY_FILE_RANGE, HAVE_BPF, HAVE_STATX are forced to 0.
Setting HAVE_NAME_TO_HANDLE_AT to 0 causes an issue, but it's not because of
the define, but because of struct file_handle.
2018-02-21 14:04:50 +01:00
|
|
|
static inline ssize_t missing_statx(int dfd, const char *filename, unsigned flags, unsigned int mask, struct statx *buffer) {
|
2018-02-20 12:48:33 +01:00
|
|
|
# ifdef __NR_statx
|
|
|
|
return syscall(__NR_statx, dfd, filename, flags, mask, buffer);
|
|
|
|
# else
|
|
|
|
errno = ENOSYS;
|
|
|
|
return -1;
|
|
|
|
# endif
|
|
|
|
}
|
2020-08-18 09:22:20 +02:00
|
|
|
#endif
|
|
|
|
|
|
|
|
/* This typedef is supposed to be always defined. */
|
|
|
|
typedef struct statx struct_statx;
|
missing_syscall: when adding syscall replacements, use different names (#8229)
In meson.build we check that functions are available using:
meson.get_compiler('c').has_function('foo')
which checks the following:
- if __stub_foo or __stub___foo are defined, return false
- if foo is declared (a pointer to the function can be taken), return true
- otherwise check for __builtin_memfd_create
_stub is documented by glibc as
It defines a symbol '__stub_FUNCTION' for each function
in the C library which is a stub, meaning it will fail
every time called, usually setting errno to ENOSYS.
So if __stub is defined, we know we don't want to use the glibc version, but
this doesn't tell us if the name itself is defined or not. If it _is_ defined,
and we define our replacement as an inline static function, we get an error:
In file included from ../src/basic/missing.h:1358:0,
from ../src/basic/util.h:47,
from ../src/basic/calendarspec.h:29,
from ../src/basic/calendarspec.c:34:
../src/basic/missing_syscall.h:65:19: error: static declaration of 'memfd_create' follows non-static declaration
static inline int memfd_create(const char *name, unsigned int flags) {
^~~~~~~~~~~~
.../usr/include/bits/mman-shared.h:46:5: note: previous declaration of 'memfd_create' was here
int memfd_create (const char *__name, unsigned int __flags) __THROW;
^~~~~~~~~~~~
To avoid this problem, call our inline functions different than glibc,
and use a #define to map the official name to our replacement.
Fixes #8099.
v2:
- use "missing_" as the prefix instead of "_"
v3:
- rebase and update for statx()
Unfortunately "statx" is also present in "struct statx", so the define
causes issues. Work around this by using a typedef.
I checked that systemd compiles with current glibc
(glibc-devel-2.26-24.fc27.x86_64) if HAVE_MEMFD_CREATE, HAVE_GETTID,
HAVE_PIVOT_ROOT, HAVE_SETNS, HAVE_RENAMEAT2, HAVE_KCMP, HAVE_KEYCTL,
HAVE_COPY_FILE_RANGE, HAVE_BPF, HAVE_STATX are forced to 0.
Setting HAVE_NAME_TO_HANDLE_AT to 0 causes an issue, but it's not because of
the define, but because of struct file_handle.
2018-02-21 14:04:50 +01:00
|
|
|
|
2020-08-18 09:22:20 +02:00
|
|
|
#if !HAVE_STATX
|
2020-08-05 23:28:21 +02:00
|
|
|
# define statx(dfd, filename, flags, mask, buffer) missing_statx(dfd, filename, flags, mask, buffer)
|
2018-02-20 12:48:33 +01:00
|
|
|
#endif
|
2019-03-12 18:58:26 +01:00
|
|
|
|
2020-08-18 09:22:20 +02:00
|
|
|
/* ======================================================================= */
|
2019-03-12 18:58:26 +01:00
|
|
|
|
2020-08-18 09:22:20 +02:00
|
|
|
#if !HAVE_SET_MEMPOLICY
|
2019-03-12 18:58:26 +01:00
|
|
|
enum {
|
|
|
|
MPOL_DEFAULT,
|
|
|
|
MPOL_PREFERRED,
|
|
|
|
MPOL_BIND,
|
|
|
|
MPOL_INTERLEAVE,
|
|
|
|
MPOL_LOCAL,
|
|
|
|
};
|
|
|
|
|
|
|
|
static inline long missing_set_mempolicy(int mode, const unsigned long *nodemask,
|
|
|
|
unsigned long maxnode) {
|
|
|
|
long i;
|
2019-12-06 20:28:13 +01:00
|
|
|
# if defined __NR_set_mempolicy && __NR_set_mempolicy >= 0
|
2019-03-12 18:58:26 +01:00
|
|
|
i = syscall(__NR_set_mempolicy, mode, nodemask, maxnode);
|
|
|
|
# else
|
|
|
|
errno = ENOSYS;
|
|
|
|
i = -1;
|
|
|
|
# endif
|
|
|
|
return i;
|
|
|
|
}
|
|
|
|
|
|
|
|
# define set_mempolicy missing_set_mempolicy
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#if !HAVE_GET_MEMPOLICY
|
|
|
|
static inline long missing_get_mempolicy(int *mode, unsigned long *nodemask,
|
|
|
|
unsigned long maxnode, void *addr,
|
|
|
|
unsigned long flags) {
|
|
|
|
long i;
|
2020-08-15 18:54:18 +02:00
|
|
|
# if defined __NR_get_mempolicy && __NR_get_mempolicy >= 0
|
2019-03-12 18:58:26 +01:00
|
|
|
i = syscall(__NR_get_mempolicy, mode, nodemask, maxnode, addr, flags);
|
|
|
|
# else
|
|
|
|
errno = ENOSYS;
|
|
|
|
i = -1;
|
|
|
|
# endif
|
|
|
|
return i;
|
|
|
|
}
|
|
|
|
|
2020-08-16 16:19:29 +02:00
|
|
|
# define get_mempolicy missing_get_mempolicy
|
2019-03-12 18:58:26 +01:00
|
|
|
#endif
|
2019-10-25 16:06:06 +02:00
|
|
|
|
2020-08-18 09:22:20 +02:00
|
|
|
/* ======================================================================= */
|
|
|
|
|
2020-08-15 19:01:23 +02:00
|
|
|
/* should be always defined, see kernel 39036cd2727395c3369b1051005da74059a85317 */
|
2020-11-13 06:58:49 +01:00
|
|
|
#define systemd_NR_pidfd_send_signal systemd_SC_arch_bias(424)
|
2020-08-18 09:22:20 +02:00
|
|
|
|
|
|
|
/* may be (invalid) negative number due to libseccomp, see PR 13319 */
|
|
|
|
#if defined __NR_pidfd_send_signal && __NR_pidfd_send_signal >= 0
|
|
|
|
# if defined systemd_NR_pidfd_send_signal
|
|
|
|
assert_cc(__NR_pidfd_send_signal == systemd_NR_pidfd_send_signal);
|
2020-08-15 19:01:23 +02:00
|
|
|
# endif
|
2020-08-18 09:22:20 +02:00
|
|
|
#else
|
|
|
|
# if defined __NR_pidfd_send_signal
|
|
|
|
# undef __NR_pidfd_send_signal
|
|
|
|
# endif
|
|
|
|
# define __NR_pidfd_send_signal systemd_NR_pidfd_send_signal
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#if !HAVE_PIDFD_SEND_SIGNAL
|
2020-08-16 16:19:29 +02:00
|
|
|
static inline int missing_pidfd_send_signal(int fd, int sig, siginfo_t *info, unsigned flags) {
|
2020-10-08 10:27:30 +02:00
|
|
|
# ifdef __NR_pidfd_send_signal
|
2019-10-25 16:06:06 +02:00
|
|
|
return syscall(__NR_pidfd_send_signal, fd, sig, info, flags);
|
2020-08-15 19:01:23 +02:00
|
|
|
# else
|
2019-10-25 16:06:06 +02:00
|
|
|
errno = ENOSYS;
|
|
|
|
return -1;
|
2020-08-15 19:01:23 +02:00
|
|
|
# endif
|
|
|
|
}
|
2020-08-16 16:19:29 +02:00
|
|
|
|
|
|
|
# define pidfd_send_signal missing_pidfd_send_signal
|
2019-10-25 16:06:06 +02:00
|
|
|
#endif
|
2020-08-15 19:01:23 +02:00
|
|
|
|
|
|
|
/* should be always defined, see kernel 7615d9e1780e26e0178c93c55b73309a5dc093d7 */
|
2020-11-13 06:58:49 +01:00
|
|
|
#define systemd_NR_pidfd_open systemd_SC_arch_bias(434)
|
2020-08-18 09:22:20 +02:00
|
|
|
|
|
|
|
/* may be (invalid) negative number due to libseccomp, see PR 13319 */
|
|
|
|
#if defined __NR_pidfd_open && __NR_pidfd_open >= 0
|
|
|
|
# if defined systemd_NR_pidfd_open
|
|
|
|
assert_cc(__NR_pidfd_open == systemd_NR_pidfd_open);
|
2020-08-15 19:01:23 +02:00
|
|
|
# endif
|
2020-08-18 09:22:20 +02:00
|
|
|
#else
|
|
|
|
# if defined __NR_pidfd_open
|
|
|
|
# undef __NR_pidfd_open
|
|
|
|
# endif
|
|
|
|
# define __NR_pidfd_open systemd_NR_pidfd_open
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#if !HAVE_PIDFD_OPEN
|
2020-08-16 16:19:29 +02:00
|
|
|
static inline int missing_pidfd_open(pid_t pid, unsigned flags) {
|
2020-08-15 19:01:23 +02:00
|
|
|
# ifdef __NR_pidfd_open
|
|
|
|
return syscall(__NR_pidfd_open, pid, flags);
|
|
|
|
# else
|
|
|
|
errno = ENOSYS;
|
|
|
|
return -1;
|
|
|
|
# endif
|
2019-10-25 16:06:06 +02:00
|
|
|
}
|
2020-08-16 16:19:29 +02:00
|
|
|
|
|
|
|
# define pidfd_open missing_pidfd_open
|
2019-10-25 16:06:06 +02:00
|
|
|
#endif
|
2019-10-30 16:29:42 +01:00
|
|
|
|
2020-08-18 09:22:20 +02:00
|
|
|
/* ======================================================================= */
|
|
|
|
|
2019-10-30 16:29:42 +01:00
|
|
|
#if !HAVE_RT_SIGQUEUEINFO
|
2020-08-16 16:19:29 +02:00
|
|
|
static inline int missing_rt_sigqueueinfo(pid_t tgid, int sig, siginfo_t *info) {
|
2020-08-18 09:22:20 +02:00
|
|
|
# if defined __NR_rt_sigqueueinfo && __NR_rt_sigqueueinfo >= 0
|
2019-10-30 16:29:42 +01:00
|
|
|
return syscall(__NR_rt_sigqueueinfo, tgid, sig, info);
|
2020-08-18 09:22:20 +02:00
|
|
|
# else
|
|
|
|
# error "__NR_rt_sigqueueinfo not defined"
|
|
|
|
# endif
|
2019-10-30 16:29:42 +01:00
|
|
|
}
|
2020-08-16 16:19:29 +02:00
|
|
|
|
|
|
|
# define rt_sigqueueinfo missing_rt_sigqueueinfo
|
2019-10-30 16:29:42 +01:00
|
|
|
#endif
|
2020-10-13 17:53:25 +02:00
|
|
|
|
shared/exec-util: use our own execveat() wrapper instead of fexecve()
For scripts, when we call fexecve(), on new kernels glibc calls execveat(),
which fails with ENOENT, and then we fall back to execve() which succeeds:
[pid 63039] execveat(3, "", ["/home/zbyszek/src/systemd/test/test-path-util/script.sh", "--version"], 0x7ffefa3633f0 /* 0 vars */, AT_EMPTY_PATH) = -1 ENOENT (No such file or directory)
[pid 63039] execve("/home/zbyszek/src/systemd/test/test-path-util/script.sh", ["/home/zbyszek/src/systemd/test/test-path-util/script.sh", "--version"], 0x7ffefa3633f0 /* 0 vars */) = 0
But on older kernels glibc (some versions?) implement a fallback which falls
into the same trap with bash $0:
[pid 13534] execve("/proc/self/fd/3", ["/home/test/systemd/test/test-path-util/script.sh", "--version"], 0x7fff84995870 /* 0 vars */) = 0
We don't want that, so let's call execveat() ourselves. Then we can do the
execve() fallback as we want.
2020-09-23 16:23:30 +02:00
|
|
|
/* ======================================================================= */
|
2020-12-07 05:32:04 +01:00
|
|
|
|
shared/exec-util: use our own execveat() wrapper instead of fexecve()
For scripts, when we call fexecve(), on new kernels glibc calls execveat(),
which fails with ENOENT, and then we fall back to execve() which succeeds:
[pid 63039] execveat(3, "", ["/home/zbyszek/src/systemd/test/test-path-util/script.sh", "--version"], 0x7ffefa3633f0 /* 0 vars */, AT_EMPTY_PATH) = -1 ENOENT (No such file or directory)
[pid 63039] execve("/home/zbyszek/src/systemd/test/test-path-util/script.sh", ["/home/zbyszek/src/systemd/test/test-path-util/script.sh", "--version"], 0x7ffefa3633f0 /* 0 vars */) = 0
But on older kernels glibc (some versions?) implement a fallback which falls
into the same trap with bash $0:
[pid 13534] execve("/proc/self/fd/3", ["/home/test/systemd/test/test-path-util/script.sh", "--version"], 0x7fff84995870 /* 0 vars */) = 0
We don't want that, so let's call execveat() ourselves. Then we can do the
execve() fallback as we want.
2020-09-23 16:23:30 +02:00
|
|
|
#if !HAVE_EXECVEAT
|
|
|
|
static inline int missing_execveat(int dirfd, const char *pathname,
|
|
|
|
char *const argv[], char *const envp[],
|
|
|
|
int flags) {
|
|
|
|
# if defined __NR_execveat && __NR_execveat >= 0
|
|
|
|
return syscall(__NR_execveat, dirfd, pathname, argv, envp, flags);
|
|
|
|
# else
|
|
|
|
errno = ENOSYS;
|
|
|
|
return -1;
|
|
|
|
# endif
|
|
|
|
}
|
2020-12-07 05:32:04 +01:00
|
|
|
|
shared/exec-util: use our own execveat() wrapper instead of fexecve()
For scripts, when we call fexecve(), on new kernels glibc calls execveat(),
which fails with ENOENT, and then we fall back to execve() which succeeds:
[pid 63039] execveat(3, "", ["/home/zbyszek/src/systemd/test/test-path-util/script.sh", "--version"], 0x7ffefa3633f0 /* 0 vars */, AT_EMPTY_PATH) = -1 ENOENT (No such file or directory)
[pid 63039] execve("/home/zbyszek/src/systemd/test/test-path-util/script.sh", ["/home/zbyszek/src/systemd/test/test-path-util/script.sh", "--version"], 0x7ffefa3633f0 /* 0 vars */) = 0
But on older kernels glibc (some versions?) implement a fallback which falls
into the same trap with bash $0:
[pid 13534] execve("/proc/self/fd/3", ["/home/test/systemd/test/test-path-util/script.sh", "--version"], 0x7fff84995870 /* 0 vars */) = 0
We don't want that, so let's call execveat() ourselves. Then we can do the
execve() fallback as we want.
2020-09-23 16:23:30 +02:00
|
|
|
# undef AT_EMPTY_PATH
|
|
|
|
# define AT_EMPTY_PATH 0x1000
|
|
|
|
# define execveat missing_execveat
|
|
|
|
#endif
|
|
|
|
|
2020-10-13 17:53:25 +02:00
|
|
|
/* ======================================================================= */
|
|
|
|
|
|
|
|
#define systemd_NR_close_range systemd_SC_arch_bias(436)
|
|
|
|
|
|
|
|
/* may be (invalid) negative number due to libseccomp, see PR 13319 */
|
|
|
|
#if defined __NR_close_range && __NR_close_range >= 0
|
|
|
|
# if defined systemd_NR_close_range
|
|
|
|
assert_cc(__NR_close_range == systemd_NR_close_range);
|
|
|
|
# endif
|
|
|
|
#else
|
|
|
|
# if defined __NR_close_range
|
|
|
|
# undef __NR_close_range
|
|
|
|
# endif
|
|
|
|
# if defined systemd_NR_close_range
|
|
|
|
# define __NR_close_range systemd_NR_close_range
|
|
|
|
# endif
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#if !HAVE_CLOSE_RANGE
|
|
|
|
static inline int missing_close_range(int first_fd, int end_fd, unsigned flags) {
|
|
|
|
# ifdef __NR_close_range
|
|
|
|
/* Kernel-side the syscall expects fds as unsigned integers (just like close() actually), while
|
|
|
|
* userspace exclusively uses signed integers for fds. We don't know just yet how glibc is going to
|
|
|
|
* wrap this syscall, but let's assume it's going to be similar to what they do for close(),
|
|
|
|
* i.e. make the same unsigned → signed type change from the raw kernel syscall compared to the
|
|
|
|
* userspace wrapper. There's only one caveat for this: unlike for close() there's the special
|
|
|
|
* UINT_MAX fd value for the 'end_fd' argument. Let's safely map that to -1 here. And let's refuse
|
|
|
|
* any other negative values. */
|
|
|
|
if ((first_fd < 0) || (end_fd < 0 && end_fd != -1)) {
|
|
|
|
errno = -EBADF;
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
|
|
|
|
return syscall(__NR_close_range,
|
|
|
|
(unsigned) first_fd,
|
|
|
|
end_fd == -1 ? UINT_MAX : (unsigned) end_fd, /* Of course, the compiler should figure out that this is the identity mapping IRL */
|
|
|
|
flags);
|
|
|
|
# else
|
|
|
|
errno = ENOSYS;
|
|
|
|
return -1;
|
|
|
|
# endif
|
|
|
|
}
|
|
|
|
|
|
|
|
# define close_range missing_close_range
|
|
|
|
#endif
|