From 64a04c848a264525c783a20a39b8f520fdce258e Mon Sep 17 00:00:00 2001 From: Christian Brauner Date: Tue, 4 May 2021 16:09:48 +0200 Subject: [PATCH] conf: add personality_t Catch errors in personality handling better. Signed-off-by: Christian Brauner --- src/lxc/attach.c | 6 +++--- src/lxc/conf.c | 4 ++-- src/lxc/conf.h | 13 ++++++++++++- src/lxc/confile.c | 2 +- 4 files changed, 18 insertions(+), 7 deletions(-) diff --git a/src/lxc/attach.c b/src/lxc/attach.c index 929a6fea3..b3aa8ca08 100644 --- a/src/lxc/attach.c +++ b/src/lxc/attach.c @@ -95,7 +95,7 @@ struct attach_context { uid_t target_host_gid; char *lsm_label; struct lxc_container *container; - signed long personality; + personality_t personality; unsigned long long capability_mask; int ns_inherited; int ns_fd[LXC_NS_MAX]; @@ -197,7 +197,7 @@ static struct attach_context *alloc_attach_context(void) } static int get_personality(const char *name, const char *lxcpath, - signed long *personality) + personality_t *personality) { __do_free char *p = NULL; int ret; @@ -1153,7 +1153,7 @@ __noreturn static void do_attach(struct attach_payload *ap) new_personality = options->personality; if (new_personality != LXC_ARCH_UNCHANGED) { - ret = personality(new_personality); + ret = lxc_personality(new_personality); if (ret < 0) goto on_error; diff --git a/src/lxc/conf.c b/src/lxc/conf.c index bd9849b07..72e21b530 100644 --- a/src/lxc/conf.c +++ b/src/lxc/conf.c @@ -1728,14 +1728,14 @@ static int lxc_setup_devpts_child(struct lxc_handler *handler) return 0; } -static int setup_personality(signed long persona) +static int setup_personality(personality_t persona) { int ret; if (persona == LXC_ARCH_UNCHANGED) return log_debug(0, "Retaining original personality"); - ret = personality(persona); + ret = lxc_personality(persona); if (ret < 0) return syserror("Failed to set personality to \"0lx%lx\"", persona); diff --git a/src/lxc/conf.h b/src/lxc/conf.h index 969f75b9b..a518e830a 100644 --- a/src/lxc/conf.h +++ b/src/lxc/conf.h @@ -26,6 +26,7 @@ #include "start.h" #include "storage/storage.h" #include "string_utils.h" +#include "syscall_wrappers.h" #include "terminal.h" #if HAVE_SYS_RESOURCE_H @@ -36,6 +37,8 @@ typedef void * scmp_filter_ctx; #endif +typedef signed long personality_t; + /* worth moving to configure.ac? */ #define subuidfile "/etc/subuid" #define subgidfile "/etc/subgid" @@ -327,7 +330,7 @@ struct lxc_conf { const char *name; bool is_execute; int reboot; - signed long personality; + personality_t personality; struct utsname *utsname; struct { @@ -628,4 +631,12 @@ static inline void lxc_clear_cgroup2_devices(struct bpf_devices *bpf_devices) lxc_list_init(&bpf_devices->device_item); } +static inline int lxc_personality(personality_t persona) +{ + if (persona < 0) + return ret_errno(EINVAL); + + return personality(persona); +} + #endif /* __LXC_CONF_H */ diff --git a/src/lxc/confile.c b/src/lxc/confile.c index d895568fb..524c151a5 100644 --- a/src/lxc/confile.c +++ b/src/lxc/confile.c @@ -1389,7 +1389,7 @@ static int set_config_personality(const char *key, const char *value, struct lxc_conf *lxc_conf, void *data) { int ret; - signed long personality; + personality_t personality; ret = lxc_config_parse_arch(value, &personality); if (ret < 0) -- 2.47.2