conf: rework lxc_config_parse_arch()

Fix architecture parsing. So far we couldn't really differ between "want default architecture" and "failed to parse requested architecture" because the -1 return value means both. Fix this by using the return value only to indicate success or failure and return the parsed personality in a return argument. Signed-off-by: 's avatarChristian Brauner <christian.brauner@ubuntu.com>
parent 9c601e1f
...@@ -200,6 +200,7 @@ static int get_personality(const char *name, const char *lxcpath, ...@@ -200,6 +200,7 @@ static int get_personality(const char *name, const char *lxcpath,
signed long *personality) signed long *personality)
{ {
__do_free char *p = NULL; __do_free char *p = NULL;
int ret;
signed long per; signed long per;
p = lxc_cmd_get_config_item(name, "lxc.arch", lxcpath); p = lxc_cmd_get_config_item(name, "lxc.arch", lxcpath);
...@@ -208,9 +209,9 @@ static int get_personality(const char *name, const char *lxcpath, ...@@ -208,9 +209,9 @@ static int get_personality(const char *name, const char *lxcpath,
return 0; return 0;
} }
per = lxc_config_parse_arch(p); ret = lxc_config_parse_arch(p, &per);
if (per == LXC_ARCH_UNCHANGED) if (ret < 0)
return ret_errno(EINVAL); return syserror("Failed to parse personality");
*personality = per; *personality = per;
return 0; return 0;
......
...@@ -1388,14 +1388,14 @@ static int set_config_hooks_version(const char *key, const char *value, ...@@ -1388,14 +1388,14 @@ static int set_config_hooks_version(const char *key, const char *value,
static int set_config_personality(const char *key, const char *value, static int set_config_personality(const char *key, const char *value,
struct lxc_conf *lxc_conf, void *data) struct lxc_conf *lxc_conf, void *data)
{ {
int ret;
signed long personality; signed long personality;
personality = lxc_config_parse_arch(value); ret = lxc_config_parse_arch(value, &personality);
if (personality >= 0) if (ret < 0)
lxc_conf->personality = personality; return syserror("Unsupported personality \"%s\"", value);
else
WARN("Unsupported personality \"%s\"", value);
lxc_conf->personality = personality;
return 0; return 0;
} }
...@@ -3209,7 +3209,7 @@ void lxc_config_define_free(struct lxc_list *defines) ...@@ -3209,7 +3209,7 @@ void lxc_config_define_free(struct lxc_list *defines)
} }
} }
signed long lxc_config_parse_arch(const char *arch) int lxc_config_parse_arch(const char *arch, signed long *persona)
{ {
static struct per_name { static struct per_name {
char *name; char *name;
...@@ -3242,13 +3242,16 @@ signed long lxc_config_parse_arch(const char *arch) ...@@ -3242,13 +3242,16 @@ signed long lxc_config_parse_arch(const char *arch)
{ "s390x", PER_LINUX }, { "s390x", PER_LINUX },
{ "x86_64", PER_LINUX }, { "x86_64", PER_LINUX },
}; };
size_t len = sizeof(pername) / sizeof(pername[0]);
for (int i = 0; i < len; i++) for (int i = 0; i < ARRAY_SIZE(pername); i++) {
if (strequal(pername[i].name, arch)) if (!strequal(pername[i].name, arch))
return pername[i].per; continue;
*persona = pername[i].per;
return 0;
}
return LXC_ARCH_UNCHANGED; return ret_errno(EINVAL);
} }
int lxc_fill_elevated_privileges(char *flaglist, int *flags) int lxc_fill_elevated_privileges(char *flaglist, int *flags)
......
...@@ -84,11 +84,10 @@ __hidden extern void lxc_config_define_free(struct lxc_list *defines); ...@@ -84,11 +84,10 @@ __hidden extern void lxc_config_define_free(struct lxc_list *defines);
#define LXC_ARCH_UNCHANGED 0xffffffffL #define LXC_ARCH_UNCHANGED 0xffffffffL
/* /*
* Parse personality of the container. Returns LXC_ARCH_UNCHANGED if the * Parse personality of the container. Returns 0 if personality is valid,
* personality is not know. * negative errno otherwise.
* (Used during attach.)
*/ */
__hidden extern signed long lxc_config_parse_arch(const char *arch); __hidden extern int lxc_config_parse_arch(const char *arch, signed long *persona);
__hidden extern int lxc_fill_elevated_privileges(char *flaglist, int *flags); __hidden extern int lxc_fill_elevated_privileges(char *flaglist, int *flags);
......
...@@ -154,8 +154,8 @@ static int my_parser(struct lxc_arguments *args, int c, char *arg) ...@@ -154,8 +154,8 @@ static int my_parser(struct lxc_arguments *args, int c, char *arg)
break; break;
case 'R': remount_sys_proc = 1; break; case 'R': remount_sys_proc = 1; break;
case 'a': case 'a':
new_personality = lxc_config_parse_arch(arg); ret = lxc_config_parse_arch(arg, &new_personality);
if (new_personality < 0) { if (ret < 0) {
ERROR("Invalid architecture specified: %s", arg); ERROR("Invalid architecture specified: %s", arg);
return -1; return -1;
} }
......
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