lxc-start: exit early and cleanly if we have insufficient privs

Signed-off-by: Serge Hallyn <serge.hallyn@canonical.com>
Signed-off-by: Daniel Lezcano <dlezcano@fr.ibm.com>
This commit is contained in:
Serge Hallyn 2012-02-02 15:54:53 -06:00 committed by Daniel Lezcano
parent 341a9bd8ac
commit 4a2ca8b2ba
3 changed files with 47 additions and 0 deletions

View File

@ -213,3 +213,42 @@ int lxc_caps_last_cap(void)
return last_cap;
}
/*
* check if we have the caps needed to start a container. returns 1 on
* success, 0 on error. (I'd prefer this be a bool, but am afraid that
* might fail to build on some distros).
*/
int lxc_caps_check(void)
{
uid_t uid = getuid();
cap_t caps;
cap_flag_value_t value;
int i, ret;
cap_value_t needed_caps[] = { CAP_SYS_ADMIN, CAP_NET_ADMIN, CAP_SETUID, CAP_SETGID };
#define NUMCAPS ((int) (sizeof(needed_caps) / sizeof(cap_t)))
if (!uid)
return 1;
caps = cap_get_proc();
if (!caps) {
ERROR("failed to cap_get_proc: %m");
return 0;
}
for (i=0; i<NUMCAPS; i++) {
ret = cap_get_flag(caps, needed_caps[i], CAP_EFFECTIVE, &value);
if (ret) {
ERROR("Failed to cap_get_flag: %m");
return 0;
}
if (!value) {
return 0;
}
}
return 1;
}

View File

@ -27,6 +27,7 @@ extern int lxc_caps_reset(void);
extern int lxc_caps_down(void);
extern int lxc_caps_up(void);
extern int lxc_caps_init(void);
extern int lxc_caps_check(void);
extern int lxc_caps_last_cap(void);

View File

@ -319,10 +319,17 @@ out_sigfd:
return -1;
}
extern int lxc_caps_check(void);
struct lxc_handler *lxc_init(const char *name, struct lxc_conf *conf)
{
struct lxc_handler *handler;
if (!lxc_caps_check()) {
ERROR("Not running with sufficient privilege");
return NULL;
}
handler = malloc(sizeof(*handler));
if (!handler)
return NULL;