Skip to content

Commit

Permalink
Improve behaviour for unprivileged users
Browse files Browse the repository at this point in the history
This mostly changes two things:
 - Only log to the container's logfile on start/stop/restart/execute
 - Call may_control() every time we use the API and return
   "Insufficient privileges" on failure.

NOTE: I didn't test every single one of those but I'm fairly confident
      in my copy/paste abilities and I confirmed they all build fine at least.

Signed-off-by: Stéphane Graber <stgraber@ubuntu.com>
Signed-off-by: Serge Hallyn <serge.hallyn@ubuntu.com>
  • Loading branch information
stgraber authored and hallyn committed Oct 3, 2013
1 parent 17232fe commit f5abd74
Show file tree
Hide file tree
Showing 15 changed files with 91 additions and 0 deletions.
3 changes: 3 additions & 0 deletions src/lxc/lxc_attach.c
Expand Up @@ -188,6 +188,9 @@ int main(int argc, char *argv[])
if (ret)
return ret;

if (!my_args.log_file)
my_args.log_file = "none";

ret = lxc_log_init(my_args.name, my_args.log_file, my_args.log_priority,
my_args.progname, my_args.quiet, my_args.lxcpath[0]);
if (ret)
Expand Down
9 changes: 9 additions & 0 deletions src/lxc/lxc_cgroup.c
Expand Up @@ -70,6 +70,9 @@ int main(int argc, char *argv[])
if (lxc_arguments_parse(&my_args, argc, argv))
return -1;

if (!my_args.log_file)
my_args.log_file = "none";

if (lxc_log_init(my_args.name, my_args.log_file, my_args.log_priority,
my_args.progname, my_args.quiet, my_args.lxcpath[0]))
return -1;
Expand All @@ -79,6 +82,12 @@ int main(int argc, char *argv[])
c = lxc_container_new(my_args.name, my_args.lxcpath[0]);
if (!c)
return -1;

if (!c->may_control(c)) {
ERROR("Insufficent privileges to control %s:%s", my_args.lxcpath[0], my_args.name);
return -1;
}

if (!c->is_running(c)) {
ERROR("'%s:%s' is not running", my_args.lxcpath[0], my_args.name);
lxc_container_put(c);
Expand Down
3 changes: 3 additions & 0 deletions src/lxc/lxc_checkpoint.c
Expand Up @@ -115,6 +115,9 @@ int main(int argc, char *argv[])
if (ret)
return ret;

if (!my_args.log_file)
my_args.log_file = "none";

ret = lxc_log_init(my_args.name, my_args.log_file, my_args.log_priority,
my_args.progname, my_args.quiet, my_args.lxcpath[0]);
if (ret)
Expand Down
6 changes: 6 additions & 0 deletions src/lxc/lxc_clone.c
Expand Up @@ -160,6 +160,12 @@ int main(int argc, char *argv[])
c1 = lxc_container_new(orig, lxcpath);
if (!c1)
exit(1);

if (!c1->may_control(c1)) {
fprintf(stderr, "Insufficent privileges to control %s\n", orig);
return -1;
}

if (!c1->is_defined(c1)) {
fprintf(stderr, "Error: container %s is not defined\n", orig);
lxc_container_put(c1);
Expand Down
8 changes: 8 additions & 0 deletions src/lxc/lxc_console.c
Expand Up @@ -97,6 +97,9 @@ int main(int argc, char *argv[])
if (ret)
return EXIT_FAILURE;

if (!my_args.log_file)
my_args.log_file = "none";

ret = lxc_log_init(my_args.name, my_args.log_file, my_args.log_priority,
my_args.progname, my_args.quiet, my_args.lxcpath[0]);
if (ret)
Expand All @@ -108,6 +111,11 @@ int main(int argc, char *argv[])
exit(EXIT_FAILURE);
}

if (!c->may_control(c)) {
fprintf(stderr, "Insufficent privileges to control %s\n", my_args.name);
return -1;
}

if (!c->is_running(c)) {
fprintf(stderr, "%s is not running\n", my_args.name);
exit(EXIT_FAILURE);
Expand Down
3 changes: 3 additions & 0 deletions src/lxc/lxc_create.c
Expand Up @@ -174,6 +174,9 @@ int main(int argc, char *argv[])
if (lxc_arguments_parse(&my_args, argc, argv))
exit(1);

if (!my_args.log_file)
my_args.log_file = "none";

if (lxc_log_init(my_args.name, my_args.log_file, my_args.log_priority,
my_args.progname, my_args.quiet, my_args.lxcpath[0]))
exit(1);
Expand Down
8 changes: 8 additions & 0 deletions src/lxc/lxc_destroy.c
Expand Up @@ -74,6 +74,9 @@ int main(int argc, char *argv[])
if (lxc_arguments_parse(&my_args, argc, argv))
exit(1);

if (!my_args.log_file)
my_args.log_file = "none";

if (lxc_log_init(my_args.name, my_args.log_file, my_args.log_priority,
my_args.progname, my_args.quiet, my_args.lxcpath[0]))
exit(1);
Expand All @@ -84,6 +87,11 @@ int main(int argc, char *argv[])
exit(1);
}

if (!c->may_control(c)) {
fprintf(stderr, "Insufficent privileges to control %s\n", my_args.name);
return -1;
}

if (!c->is_defined(c)) {
fprintf(stderr, "Container is not defined\n");
lxc_container_put(c);
Expand Down
8 changes: 8 additions & 0 deletions src/lxc/lxc_freeze.c
Expand Up @@ -59,6 +59,9 @@ int main(int argc, char *argv[])
if (lxc_arguments_parse(&my_args, argc, argv))
exit(1);

if (!my_args.log_file)
my_args.log_file = "none";

if (lxc_log_init(my_args.name, my_args.log_file, my_args.log_priority,
my_args.progname, my_args.quiet, my_args.lxcpath[0]))
exit(1);
Expand All @@ -69,6 +72,11 @@ int main(int argc, char *argv[])
exit(1);
}

if (!c->may_control(c)) {
ERROR("Insufficent privileges to control %s:%s", my_args.lxcpath[0], my_args.name);
return -1;
}

if (!c->freeze(c)) {
ERROR("Failed to freeze %s:%s", my_args.lxcpath[0], my_args.name);
lxc_container_put(c);
Expand Down
8 changes: 8 additions & 0 deletions src/lxc/lxc_info.c
Expand Up @@ -96,6 +96,9 @@ int main(int argc, char *argv[])
if (lxc_arguments_parse(&my_args, argc, argv))
return -1;

if (!my_args.log_file)
my_args.log_file = "none";

if (lxc_log_init(my_args.name, my_args.log_file, my_args.log_priority,
my_args.progname, my_args.quiet, my_args.lxcpath[0]))
return -1;
Expand All @@ -104,6 +107,11 @@ int main(int argc, char *argv[])
if (!c)
return -1;

if (!c->may_control(c)) {
fprintf(stderr, "Insufficent privileges to control %s\n", c->name);
return -1;
}

if (!state && !pid && !ips && keys <= 0)
state = pid = ips = true;

Expand Down
3 changes: 3 additions & 0 deletions src/lxc/lxc_kill.c
Expand Up @@ -61,6 +61,9 @@ int main(int argc, char *argv[], char *envp[])
if (ret)
return ret;

if (!my_args.log_file)
my_args.log_file = "none";

ret = lxc_log_init(my_args.name, my_args.log_file, my_args.log_priority,
my_args.progname, my_args.quiet, my_args.lxcpath[0]);
if (ret)
Expand Down
3 changes: 3 additions & 0 deletions src/lxc/lxc_monitor.c
Expand Up @@ -67,6 +67,9 @@ int main(int argc, char *argv[])
if (lxc_arguments_parse(&my_args, argc, argv))
return -1;

if (!my_args.log_file)
my_args.log_file = "none";

if (lxc_log_init(my_args.name, my_args.log_file, my_args.log_priority,
my_args.progname, my_args.quiet, my_args.lxcpath[0]))
return -1;
Expand Down
8 changes: 8 additions & 0 deletions src/lxc/lxc_snapshot.c
Expand Up @@ -160,6 +160,9 @@ int main(int argc, char *argv[])
if (lxc_arguments_parse(&my_args, argc, argv))
exit(1);

if (!my_args.log_file)
my_args.log_file = "none";

if (my_args.argc > 1) {
ERROR("Too many arguments");
return -1;
Expand All @@ -184,6 +187,11 @@ int main(int argc, char *argv[])
exit(1);
}

if (!c->may_control(c)) {
fprintf(stderr, "Insufficent privileges to control %s\n", my_args.name);
return -1;
}

switch(action) {
case DO_SNAP:
ret = do_snapshot(c);
Expand Down
5 changes: 5 additions & 0 deletions src/lxc/lxc_stop.c
Expand Up @@ -145,6 +145,11 @@ int main(int argc, char *argv[])
goto out;
}

if (!c->may_control(c)) {
fprintf(stderr, "Insufficent privileges to control %s\n", c->name);
goto out;
}

if (!c->is_running(c)) {
fprintf(stderr, "%s is not running\n", c->name);
ret = 2;
Expand Down
8 changes: 8 additions & 0 deletions src/lxc/lxc_unfreeze.c
Expand Up @@ -58,6 +58,9 @@ int main(int argc, char *argv[])
if (lxc_arguments_parse(&my_args, argc, argv))
exit(1);

if (!my_args.log_file)
my_args.log_file = "none";

if (lxc_log_init(my_args.name, my_args.log_file, my_args.log_priority,
my_args.progname, my_args.quiet, my_args.lxcpath[0]))
exit(1);
Expand All @@ -68,6 +71,11 @@ int main(int argc, char *argv[])
exit(1);
}

if (!c->may_control(c)) {
ERROR("Insufficent privileges to control %s:%s", my_args.lxcpath[0], my_args.name);
return -1;
}

if (!c->unfreeze(c)) {
ERROR("Failed to unfreeze %s:%s", my_args.lxcpath[0], my_args.name);
lxc_container_put(c);
Expand Down
8 changes: 8 additions & 0 deletions src/lxc/lxc_wait.c
Expand Up @@ -85,6 +85,9 @@ int main(int argc, char *argv[])
if (lxc_arguments_parse(&my_args, argc, argv))
return -1;

if (!my_args.log_file)
my_args.log_file = "none";

if (lxc_log_init(my_args.name, my_args.log_file, my_args.log_priority,
my_args.progname, my_args.quiet, my_args.lxcpath[0]))
return -1;
Expand All @@ -93,6 +96,11 @@ int main(int argc, char *argv[])
if (!c)
return -1;

if (!c->may_control(c)) {
fprintf(stderr, "Insufficent privileges to control %s\n", c->name);
return -1;
}

if (!c->wait(c, my_args.states, my_args.timeout)) {
lxc_container_put(c);
return -1;
Expand Down

0 comments on commit f5abd74

Please sign in to comment.