Unverified Commit ed754cd2 by Stéphane Graber Committed by GitHub

Merge pull request #3304 from brauner/2020-03-18/fixes

tree-wide: introduce and use syscall number header
parents ee555b28 bed09c9c
...@@ -43,6 +43,7 @@ noinst_HEADERS = api_extensions.h \ ...@@ -43,6 +43,7 @@ noinst_HEADERS = api_extensions.h \
storage/storage_utils.h \ storage/storage_utils.h \
storage/zfs.h \ storage/zfs.h \
string_utils.h \ string_utils.h \
syscall_numbers.h \
syscall_wrappers.h \ syscall_wrappers.h \
terminal.h \ terminal.h \
../tests/lxctest.h \ ../tests/lxctest.h \
...@@ -145,6 +146,7 @@ liblxc_la_SOURCES = af_unix.c af_unix.h \ ...@@ -145,6 +146,7 @@ liblxc_la_SOURCES = af_unix.c af_unix.h \
storage/zfs.c storage/zfs.h \ storage/zfs.c storage/zfs.h \
string_utils.c string_utils.h \ string_utils.c string_utils.h \
sync.c sync.h \ sync.c sync.h \
syscall_numbers.h \
syscall_wrappers.h \ syscall_wrappers.h \
terminal.c \ terminal.c \
utils.c utils.h \ utils.c utils.h \
...@@ -360,6 +362,7 @@ lxc_top_SOURCES = tools/lxc_top.c \ ...@@ -360,6 +362,7 @@ lxc_top_SOURCES = tools/lxc_top.c \
lxc_unfreeze_SOURCES = tools/lxc_unfreeze.c \ lxc_unfreeze_SOURCES = tools/lxc_unfreeze.c \
tools/arguments.c tools/arguments.h tools/arguments.c tools/arguments.h
lxc_unshare_SOURCES = tools/lxc_unshare.c \ lxc_unshare_SOURCES = tools/lxc_unshare.c \
syscall_numbers.h \
tools/arguments.c tools/arguments.h tools/arguments.c tools/arguments.h
lxc_wait_SOURCES = tools/lxc_wait.c \ lxc_wait_SOURCES = tools/lxc_wait.c \
tools/arguments.c tools/arguments.h tools/arguments.c tools/arguments.h
...@@ -381,6 +384,7 @@ init_lxc_SOURCES = cmd/lxc_init.c \ ...@@ -381,6 +384,7 @@ init_lxc_SOURCES = cmd/lxc_init.c \
memory_utils.h \ memory_utils.h \
parse.c parse.h \ parse.c parse.h \
raw_syscalls.c raw_syscalls.h \ raw_syscalls.c raw_syscalls.h \
syscall_numbers.h \
string_utils.c string_utils.h string_utils.c string_utils.h
init_lxc_LDFLAGS = -pthread init_lxc_LDFLAGS = -pthread
...@@ -391,6 +395,7 @@ lxc_monitord_SOURCES = cmd/lxc_monitord.c \ ...@@ -391,6 +395,7 @@ lxc_monitord_SOURCES = cmd/lxc_monitord.c \
mainloop.c mainloop.h \ mainloop.c mainloop.h \
monitor.c monitor.h \ monitor.c monitor.h \
raw_syscalls.c raw_syscalls.h \ raw_syscalls.c raw_syscalls.h \
syscall_numbers.h \
utils.c utils.h utils.c utils.h
lxc_user_nic_SOURCES = cmd/lxc_user_nic.c \ lxc_user_nic_SOURCES = cmd/lxc_user_nic.c \
../include/netns_ifaddrs.c ../include/netns_ifaddrs.h \ ../include/netns_ifaddrs.c ../include/netns_ifaddrs.h \
...@@ -399,6 +404,7 @@ lxc_user_nic_SOURCES = cmd/lxc_user_nic.c \ ...@@ -399,6 +404,7 @@ lxc_user_nic_SOURCES = cmd/lxc_user_nic.c \
network.c network.h \ network.c network.h \
parse.c parse.h \ parse.c parse.h \
raw_syscalls.c raw_syscalls.h \ raw_syscalls.c raw_syscalls.h \
syscall_numbers.h \
file_utils.c file_utils.h \ file_utils.c file_utils.h \
string_utils.c string_utils.h \ string_utils.c string_utils.h \
syscall_wrappers.h syscall_wrappers.h
......
...@@ -17,50 +17,24 @@ ...@@ -17,50 +17,24 @@
#include "conf.h" #include "conf.h"
#include "config.h" #include "config.h"
#include "syscall_numbers.h"
#ifdef HAVE_STRUCT_BPF_CGROUP_DEV_CTX #ifdef HAVE_STRUCT_BPF_CGROUP_DEV_CTX
#include <linux/bpf.h> #include <linux/bpf.h>
#include <linux/filter.h> #include <linux/filter.h>
#endif #endif
#if !HAVE_BPF #ifndef HAVE_BPF
#if !(defined __NR_bpf && __NR_bpf > 0)
#if defined __NR_bpf
#undef __NR_bpf
#endif
#if defined __i386__
#define __NR_bpf 357
#elif defined __x86_64__
#define __NR_bpf 321
#elif defined __aarch64__
#define __NR_bpf 280
#elif defined __arm__
#define __NR_bpf 386
#elif defined __sparc__
#define __NR_bpf 349
#elif defined __s390__
#define __NR_bpf 351
#elif defined __tilegx__
#define __NR_bpf 280
#else
#warning "__NR_bpf not defined for your architecture"
#endif
#endif
union bpf_attr; union bpf_attr;
static inline int missing_bpf(int cmd, union bpf_attr *attr, size_t size) static inline int missing_bpf(int cmd, union bpf_attr *attr, size_t size)
{ {
#ifdef __NR_bpf return syscall(__NR_bpf, cmd, attr, size);
return (int)syscall(__NR_bpf, cmd, attr, size);
#else
errno = ENOSYS;
return -1;
#endif
} }
#define bpf missing_bpf #define bpf missing_bpf
#endif #endif /* HAVE_BPF */
struct bpf_program { struct bpf_program {
int device_list_type; int device_list_type;
...@@ -70,7 +44,7 @@ struct bpf_program { ...@@ -70,7 +44,7 @@ struct bpf_program {
size_t n_instructions; size_t n_instructions;
#ifdef HAVE_STRUCT_BPF_CGROUP_DEV_CTX #ifdef HAVE_STRUCT_BPF_CGROUP_DEV_CTX
struct bpf_insn *instructions; struct bpf_insn *instructions;
#endif #endif /* HAVE_STRUCT_BPF_CGROUP_DEV_CTX */
char *attached_path; char *attached_path;
int attached_type; int attached_type;
...@@ -97,7 +71,7 @@ static inline void __auto_bpf_program_free__(struct bpf_program **prog) ...@@ -97,7 +71,7 @@ static inline void __auto_bpf_program_free__(struct bpf_program **prog)
} }
} }
int bpf_list_add_device(struct lxc_conf *conf, struct device_item *device); int bpf_list_add_device(struct lxc_conf *conf, struct device_item *device);
#else #else /* !HAVE_STRUCT_BPF_CGROUP_DEV_CTX */
static inline struct bpf_program *bpf_program_new(uint32_t prog_type) static inline struct bpf_program *bpf_program_new(uint32_t prog_type)
{ {
errno = ENOSYS; errno = ENOSYS;
...@@ -160,7 +134,7 @@ static inline int bpf_list_add_device(struct lxc_conf *conf, ...@@ -160,7 +134,7 @@ static inline int bpf_list_add_device(struct lxc_conf *conf,
errno = ENOSYS; errno = ENOSYS;
return -1; return -1;
} }
#endif #endif /* !HAVE_STRUCT_BPF_CGROUP_DEV_CTX */
#define __do_bpf_program_free \ #define __do_bpf_program_free \
__attribute__((__cleanup__(__auto_bpf_program_free__))) __attribute__((__cleanup__(__auto_bpf_program_free__)))
......
...@@ -81,19 +81,6 @@ ...@@ -81,19 +81,6 @@
#include "include/strlcpy.h" #include "include/strlcpy.h"
#endif #endif
/* Define faccessat() if missing from the C library */
#ifndef HAVE_FACCESSAT
static int faccessat(int __fd, const char *__file, int __type, int __flag)
{
#ifdef __NR_faccessat
return syscall(__NR_faccessat, __fd, __file, __type, __flag);
#else
errno = ENOSYS;
return -1;
#endif
}
#endif
lxc_log_define(lxccontainer, lxc); lxc_log_define(lxccontainer, lxc);
static bool do_lxcapi_destroy(struct lxc_container *c); static bool do_lxcapi_destroy(struct lxc_container *c);
......
...@@ -15,16 +15,12 @@ ...@@ -15,16 +15,12 @@
#include "config.h" #include "config.h"
#include "macro.h" #include "macro.h"
#include "raw_syscalls.h" #include "raw_syscalls.h"
#include "syscall_numbers.h"
int lxc_raw_execveat(int dirfd, const char *pathname, char *const argv[], int lxc_raw_execveat(int dirfd, const char *pathname, char *const argv[],
char *const envp[], int flags) char *const envp[], int flags)
{ {
#ifdef __NR_execveat return syscall(__NR_execveat, dirfd, pathname, argv, envp, flags);
syscall(__NR_execveat, dirfd, pathname, argv, envp, flags);
#else
errno = ENOSYS;
#endif
return -1;
} }
/* /*
...@@ -123,11 +119,6 @@ pid_t lxc_raw_clone_cb(int (*fn)(void *), void *args, unsigned long flags, ...@@ -123,11 +119,6 @@ pid_t lxc_raw_clone_cb(int (*fn)(void *), void *args, unsigned long flags,
return pid; return pid;
} }
/* For all the architectures we care about it's the same syscall number. */
#ifndef __NR_pidfd_send_signal
#define __NR_pidfd_send_signal 424
#endif
int lxc_raw_pidfd_send_signal(int pidfd, int sig, siginfo_t *info, int lxc_raw_pidfd_send_signal(int pidfd, int sig, siginfo_t *info,
unsigned int flags) unsigned int flags)
{ {
......
...@@ -81,7 +81,7 @@ static inline pid_t lxc_raw_getpid(void) ...@@ -81,7 +81,7 @@ static inline pid_t lxc_raw_getpid(void)
static inline pid_t lxc_raw_gettid(void) static inline pid_t lxc_raw_gettid(void)
{ {
#ifdef __NR_gettid #if __NR_gettid > 0
return syscall(__NR_gettid); return syscall(__NR_gettid);
#else #else
return lxc_raw_getpid(); return lxc_raw_getpid();
......
...@@ -38,12 +38,7 @@ lxc_log_define(seccomp, lxc); ...@@ -38,12 +38,7 @@ lxc_log_define(seccomp, lxc);
static inline int __seccomp(unsigned int operation, unsigned int flags, static inline int __seccomp(unsigned int operation, unsigned int flags,
void *args) void *args)
{ {
#ifdef __NR_seccomp
return syscall(__NR_seccomp, operation, flags, args); return syscall(__NR_seccomp, operation, flags, args);
#else
errno = ENOSYS;
return -1;
#endif
} }
#endif #endif
......
...@@ -16,6 +16,7 @@ ...@@ -16,6 +16,7 @@
#include <unistd.h> #include <unistd.h>
#include "config.h" #include "config.h"
#include "syscall_numbers.h"
#ifdef HAVE_LINUX_MEMFD_H #ifdef HAVE_LINUX_MEMFD_H
#include <linux/memfd.h> #include <linux/memfd.h>
...@@ -31,12 +32,7 @@ typedef int32_t key_serial_t; ...@@ -31,12 +32,7 @@ typedef int32_t key_serial_t;
static inline long __keyctl(int cmd, unsigned long arg2, unsigned long arg3, static inline long __keyctl(int cmd, unsigned long arg2, unsigned long arg3,
unsigned long arg4, unsigned long arg5) unsigned long arg4, unsigned long arg5)
{ {
#ifdef __NR_keyctl
return syscall(__NR_keyctl, cmd, arg2, arg3, arg4, arg5); return syscall(__NR_keyctl, cmd, arg2, arg3, arg4, arg5);
#else
errno = ENOSYS;
return -1;
#endif
} }
#define keyctl __keyctl #define keyctl __keyctl
#endif #endif
...@@ -56,90 +52,29 @@ static inline long __keyctl(int cmd, unsigned long arg2, unsigned long arg3, ...@@ -56,90 +52,29 @@ static inline long __keyctl(int cmd, unsigned long arg2, unsigned long arg3,
#endif #endif
#ifndef HAVE_MEMFD_CREATE #ifndef HAVE_MEMFD_CREATE
static inline int memfd_create_lxc(const char *name, unsigned int flags) { static inline int memfd_create_lxc(const char *name, unsigned int flags)
#ifndef __NR_memfd_create {
#if defined __i386__
#define __NR_memfd_create 356
#elif defined __x86_64__
#define __NR_memfd_create 319
#elif defined __arm__
#define __NR_memfd_create 385
#elif defined __aarch64__
#define __NR_memfd_create 279
#elif defined __s390__
#define __NR_memfd_create 350
#elif defined __powerpc__
#define __NR_memfd_create 360
#elif defined __sparc__
#define __NR_memfd_create 348
#elif defined __blackfin__
#define __NR_memfd_create 390
#elif defined __ia64__
#define __NR_memfd_create 1340
#elif defined _MIPS_SIM
#if _MIPS_SIM == _MIPS_SIM_ABI32
#define __NR_memfd_create 4354
#endif
#if _MIPS_SIM == _MIPS_SIM_NABI32
#define __NR_memfd_create 6318
#endif
#if _MIPS_SIM == _MIPS_SIM_ABI64
#define __NR_memfd_create 5314
#endif
#endif
#endif
#ifdef __NR_memfd_create
return syscall(__NR_memfd_create, name, flags); return syscall(__NR_memfd_create, name, flags);
#else
errno = ENOSYS;
return -1;
#endif
} }
#define memfd_create memfd_create_lxc #define memfd_create memfd_create_lxc
#else #else
extern int memfd_create(const char *name, unsigned int flags); extern int memfd_create(const char *name, unsigned int flags);
#endif #endif
#if !HAVE_PIVOT_ROOT #ifndef HAVE_PIVOT_ROOT
static int pivot_root(const char *new_root, const char *put_old) static int pivot_root(const char *new_root, const char *put_old)
{ {
#ifdef __NR_pivot_root
return syscall(__NR_pivot_root, new_root, put_old); return syscall(__NR_pivot_root, new_root, put_old);
#else
errno = ENOSYS;
return -1;
#endif
} }
#else #else
extern int pivot_root(const char *new_root, const char *put_old); extern int pivot_root(const char *new_root, const char *put_old);
#endif #endif
#if !defined(__NR_setns) && !defined(__NR_set_ns)
#if defined(__x86_64__)
#define __NR_setns 308
#elif defined(__i386__)
#define __NR_setns 346
#elif defined(__arm__)
#define __NR_setns 375
#elif defined(__aarch64__)
#define __NR_setns 375
#elif defined(__powerpc__)
#define __NR_setns 350
#elif defined(__s390__)
#define __NR_setns 339
#endif
#endif
/* Define sethostname() if missing from the C library */ /* Define sethostname() if missing from the C library */
#ifndef HAVE_SETHOSTNAME #ifndef HAVE_SETHOSTNAME
static inline int sethostname(const char *name, size_t len) static inline int sethostname(const char *name, size_t len)
{ {
#ifdef __NR_sethostname
return syscall(__NR_sethostname, name, len); return syscall(__NR_sethostname, name, len);
#else
errno = ENOSYS;
return -1;
#endif
} }
#endif #endif
...@@ -147,14 +82,7 @@ static inline int sethostname(const char *name, size_t len) ...@@ -147,14 +82,7 @@ static inline int sethostname(const char *name, size_t len)
#ifndef HAVE_SETNS #ifndef HAVE_SETNS
static inline int setns(int fd, int nstype) static inline int setns(int fd, int nstype)
{ {
#ifdef __NR_setns
return syscall(__NR_setns, fd, nstype); return syscall(__NR_setns, fd, nstype);
#elif defined(__NR_set_ns)
return syscall(__NR_set_ns, fd, nstype);
#else
errno = ENOSYS;
return -1;
#endif
} }
#endif #endif
...@@ -179,48 +107,6 @@ struct signalfd_siginfo { ...@@ -179,48 +107,6 @@ struct signalfd_siginfo {
uint8_t __pad[48]; uint8_t __pad[48];
}; };
#ifndef __NR_signalfd4
/* assume kernel headers are too old */
#if __i386__
#define __NR_signalfd4 327
#elif __x86_64__
#define __NR_signalfd4 289
#elif __powerpc__
#define __NR_signalfd4 313
#elif __s390x__
#define __NR_signalfd4 322
#elif __arm__
#define __NR_signalfd4 355
#elif __mips__ && _MIPS_SIM == _ABIO32
#define __NR_signalfd4 4324
#elif __mips__ && _MIPS_SIM == _ABI64
#define __NR_signalfd4 5283
#elif __mips__ && _MIPS_SIM == _ABIN32
#define __NR_signalfd4 6287
#endif
#endif
#ifndef __NR_signalfd
/* assume kernel headers are too old */
#if __i386__
#define __NR_signalfd 321
#elif __x86_64__
#define __NR_signalfd 282
#elif __powerpc__
#define __NR_signalfd 305
#elif __s390x__
#define __NR_signalfd 316
#elif __arm__
#define __NR_signalfd 349
#elif __mips__ && _MIPS_SIM == _ABIO32
#define __NR_signalfd 4317
#elif __mips__ && _MIPS_SIM == _ABI64
#define __NR_signalfd 5276
#elif __mips__ && _MIPS_SIM == _ABIN32
#define __NR_signalfd 6280
#endif
#endif
static inline int signalfd(int fd, const sigset_t *mask, int flags) static inline int signalfd(int fd, const sigset_t *mask, int flags)
{ {
int retval; int retval;
...@@ -237,15 +123,18 @@ static inline int signalfd(int fd, const sigset_t *mask, int flags) ...@@ -237,15 +123,18 @@ static inline int signalfd(int fd, const sigset_t *mask, int flags)
#ifndef HAVE_UNSHARE #ifndef HAVE_UNSHARE
static inline int unshare(int flags) static inline int unshare(int flags)
{ {
#ifdef __NR_unshare
return syscall(__NR_unshare, flags); return syscall(__NR_unshare, flags);
#else
errno = ENOSYS;
return -1;
#endif
} }
#else #else
extern int unshare(int); extern int unshare(int);
#endif #endif
/* Define faccessat() if missing from the C library */
#ifndef HAVE_FACCESSAT
static int faccessat(int __fd, const char *__file, int __type, int __flag)
{
return syscall(__NR_faccessat, __fd, __file, __type, __flag);
}
#endif
#endif /* __LXC_SYSCALL_WRAPPER_H */ #endif /* __LXC_SYSCALL_WRAPPER_H */
...@@ -41,7 +41,6 @@ struct start_arg { ...@@ -41,7 +41,6 @@ struct start_arg {
}; };
static int my_parser(struct lxc_arguments *args, int c, char *arg); static int my_parser(struct lxc_arguments *args, int c, char *arg);
static inline int sethostname_including_android(const char *name, size_t len);
static int get_namespace_flags(char *namespaces); static int get_namespace_flags(char *namespaces);
static bool lookup_user(const char *oparg, uid_t *uid); static bool lookup_user(const char *oparg, uid_t *uid);
static int mount_fs(const char *source, const char *target, const char *type); static int mount_fs(const char *source, const char *target, const char *type);
...@@ -129,23 +128,6 @@ static int my_parser(struct lxc_arguments *args, int c, char *arg) ...@@ -129,23 +128,6 @@ static int my_parser(struct lxc_arguments *args, int c, char *arg)
return 0; return 0;
} }
/* Define sethostname() if missing from the C library also workaround some
* quirky with having this defined in multiple places.
*/
static inline int sethostname_including_android(const char *name, size_t len)
{
#ifndef HAVE_SETHOSTNAME
#ifdef __NR_sethostname
return syscall(__NR_sethostname, name, len);
#else
errno = ENOSYS;
return -1;
#endif
#else
return sethostname(name, len);
#endif
}
static int get_namespace_flags(char *namespaces) static int get_namespace_flags(char *namespaces)
{ {
int flags = 0; int flags = 0;
...@@ -266,7 +248,7 @@ static int do_start(void *arg) ...@@ -266,7 +248,7 @@ static int do_start(void *arg)
lxc_setup_fs(); lxc_setup_fs();
if ((start_arg->flags & CLONE_NEWUTS) && want_hostname) if ((start_arg->flags & CLONE_NEWUTS) && want_hostname)
if (sethostname_including_android(want_hostname, strlen(want_hostname)) < 0) { if (sethostname(want_hostname, strlen(want_hostname)) < 0) {
SYSERROR("Failed to set hostname %s", want_hostname); SYSERROR("Failed to set hostname %s", want_hostname);
_exit(EXIT_FAILURE); _exit(EXIT_FAILURE);
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment