From a98b21a035844bed64eff8c9a0174d21179c085f Mon Sep 17 00:00:00 2001 From: Christian Brauner Date: Fri, 29 Jan 2021 11:31:53 +0100 Subject: [PATCH] attach: fix personality handling Signed-off-by: Christian Brauner --- src/lxc/attach.c | 33 ++++++++++++++++++++++----------- src/lxc/attach_options.h | 2 +- src/lxc/confile.c | 2 +- src/lxc/confile.h | 7 ++++++- 4 files changed, 30 insertions(+), 14 deletions(-) diff --git a/src/lxc/attach.c b/src/lxc/attach.c index 9ad7a56d8e..f66f65a5ba 100644 --- a/src/lxc/attach.c +++ b/src/lxc/attach.c @@ -71,15 +71,24 @@ static struct attach_context *alloc_attach_context(void) return zalloc(sizeof(struct attach_context)); } -static signed long get_personality(const char *name, const char *lxcpath) +static int get_personality(const char *name, const char *lxcpath, + signed long *personality) { __do_free char *p = NULL; + signed long per; p = lxc_cmd_get_config_item(name, "lxc.arch", lxcpath); - if (!p) - return -1; + if (!p) { + *personality = LXC_ARCH_UNCHANGED; + return 0; + } + + per = lxc_config_parse_arch(p); + if (per == LXC_ARCH_UNCHANGED) + return ret_errno(EINVAL); - return lxc_config_parse_arch(p); + *personality = per; + return 0; } static int get_attach_context(struct attach_context *ctx, @@ -127,9 +136,9 @@ static int get_attach_context(struct attach_context *ctx, for (int i = 0; i < LXC_NS_MAX; i++) ctx->ns_fd[i] = -EBADF; - ctx->personality = get_personality(container->name, container->config_path); - if (ctx->personality < 0) - return log_error_errno(-ENOENT, ENOENT, "Failed to get personality of the container"); + ret = get_personality(container->name, container->config_path, &ctx->personality); + if (ret) + return log_error_errno(ret, errno, "Failed to get personality of the container"); if (!ctx->container->lxc_conf) { ctx->container->lxc_conf = lxc_conf_init(); @@ -751,11 +760,13 @@ __noreturn static void do_attach(struct attach_clone_payload *payload) else new_personality = options->personality; - ret = personality(new_personality); - if (ret < 0) - goto on_error; + if (new_personality != LXC_ARCH_UNCHANGED) { + ret = personality(new_personality); + if (ret < 0) + goto on_error; - TRACE("Set new personality"); + TRACE("Set new personality"); + } } #endif diff --git a/src/lxc/attach_options.h b/src/lxc/attach_options.h index 80fe439103..3a596fb305 100644 --- a/src/lxc/attach_options.h +++ b/src/lxc/attach_options.h @@ -124,7 +124,7 @@ typedef struct lxc_attach_options_t { { \ /* .attach_flags = */ LXC_ATTACH_DEFAULT, \ /* .namespaces = */ -1, \ - /* .personality = */ -1, \ + /* .personality = */ 0xffffffff, \ /* .initial_cwd = */ NULL, \ /* .uid = */ (uid_t)-1, \ /* .gid = */ (gid_t)-1, \ diff --git a/src/lxc/confile.c b/src/lxc/confile.c index b69ab3ad2d..409c547cb2 100644 --- a/src/lxc/confile.c +++ b/src/lxc/confile.c @@ -2825,7 +2825,7 @@ signed long lxc_config_parse_arch(const char *arch) return pername[i].per; #endif - return -1; + return LXC_ARCH_UNCHANGED; } int lxc_fill_elevated_privileges(char *flaglist, int *flags) diff --git a/src/lxc/confile.h b/src/lxc/confile.h index 68d50fc804..f182dfaf45 100644 --- a/src/lxc/confile.h +++ b/src/lxc/confile.h @@ -78,7 +78,12 @@ __hidden extern bool lxc_config_define_load(struct lxc_list *defines, struct lxc __hidden extern void lxc_config_define_free(struct lxc_list *defines); -/* needed for lxc-attach */ +#define LXC_ARCH_UNCHANGED 0xffffffffL +/* + * Parse personality of the container. Returns LXC_ARCH_UNCHANGED if the + * personality is not know. + * (Used during attach.) + */ __hidden extern signed long lxc_config_parse_arch(const char *arch); __hidden extern int lxc_fill_elevated_privileges(char *flaglist, int *flags);