mirror of
https://git.proxmox.com/git/mirror_lxc
synced 2025-07-24 22:56:47 +00:00
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:
parent
341a9bd8ac
commit
4a2ca8b2ba
@ -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;
|
||||
}
|
||||
|
@ -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);
|
||||
|
||||
|
@ -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;
|
||||
|
Loading…
Reference in New Issue
Block a user