Skip to content

Commit

Permalink
attach: fix personality handling
Browse files Browse the repository at this point in the history
Signed-off-by: Christian Brauner <christian.brauner@ubuntu.com>
  • Loading branch information
Christian Brauner committed Feb 26, 2021
1 parent 19615bf commit a98b21a
Show file tree
Hide file tree
Showing 4 changed files with 30 additions and 14 deletions.
33 changes: 22 additions & 11 deletions src/lxc/attach.c
Expand Up @@ -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,
Expand Down Expand Up @@ -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();
Expand Down Expand Up @@ -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

Expand Down
2 changes: 1 addition & 1 deletion src/lxc/attach_options.h
Expand Up @@ -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, \
Expand Down
2 changes: 1 addition & 1 deletion src/lxc/confile.c
Expand Up @@ -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)
Expand Down
7 changes: 6 additions & 1 deletion src/lxc/confile.h
Expand Up @@ -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);
Expand Down

0 comments on commit a98b21a

Please sign in to comment.