1. in container_free, set c->privlock to NULL before calling
sem_destroy, to prevent a window where another thread could call
sem_wait(c->privlock) while c->privlock is not NULL but is already
destroyed.
2. in container_get, check for numthreads < 0 before calling lxclock.
Once numthreads is 0, it never goes back up.
Following is a comment added to lxccontainer.c:
/*
* Consider the following case:
freer | racing get()er
==================================================================
lxc_container_put() | lxc_container_get()
\ lxclock(c->privlock) | c->numthreads < 1? (no)
\ c->numthreads = 0 | \ lxclock(c->privlock) -> waits
\ lxcunlock() | \
\ lxc_container_free() | \ lxclock() returns
| \ c->numthreads < 1 -> return 0
\ \ (free stuff) |
\ \ sem_destroy(privlock) |
* When the get()er checks numthreads the first time, one of the following
* is true:
* 1. freer has set numthreads = 0. get() returns 0
* 2. freer is between lxclock and setting numthreads to 0. get()er will
* sem_wait on privlock, get lxclock after freer() drops it, then see
* numthreads is 0 and exit without touching lxclock again..
* 3. freer has not yet locked privlock. If get()er runs first, then put()er
* will see --numthreads = 1 and not call lxc_container_free().
*/
Signed-off-by:
Serge Hallyn <serge.hallyn@ubuntu.com>
Acked-by:
Seth Arnold <seth.arnold@canonical.com>
Acked-by:
Stéphane Graber <stgraber@ubuntu.com>
| Name |
Last commit
|
Last update |
|---|---|---|
| .. | ||
| legacy | Loading commit data... | |
| Makefile.am | Loading commit data... | |
| af_unix.c | Loading commit data... | |
| af_unix.h | Loading commit data... | |
| apparmor.c | Loading commit data... | |
| apparmor.h | Loading commit data... | |
| arguments.c | Loading commit data... | |
| arguments.h | Loading commit data... | |
| attach.c | Loading commit data... | |
| attach.h | Loading commit data... | |
| caps.c | Loading commit data... | |
| caps.h | Loading commit data... | |
| cgroup.c | Loading commit data... | |
| cgroup.h | Loading commit data... | |
| checkpoint.c | Loading commit data... | |
| commands.c | Loading commit data... | |
| commands.h | Loading commit data... | |
| conf.c | Loading commit data... | |
| conf.h | Loading commit data... | |
| confile.c | Loading commit data... | |
| confile.h | Loading commit data... | |
| console.c | Loading commit data... | |
| console.h | Loading commit data... | |
| error.c | Loading commit data... | |
| error.h | Loading commit data... | |
| execute.c | Loading commit data... | |
| freezer.c | Loading commit data... | |
| genl.c | Loading commit data... | |
| genl.h | Loading commit data... | |
| list.c | Loading commit data... | |
| list.h | Loading commit data... | |
| log.c | Loading commit data... | |
| log.h | Loading commit data... | |
| lxc-checkconfig.in | Loading commit data... | |
| lxc-clone.in | Loading commit data... | |
| lxc-create.in | Loading commit data... | |
| lxc-destroy.in | Loading commit data... | |
| lxc-device | Loading commit data... | |
| lxc-ls | Loading commit data... | |
| lxc-netstat.in | Loading commit data... | |
| lxc-ps.in | Loading commit data... | |
| lxc-shutdown.in | Loading commit data... | |
| lxc-start-ephemeral.in | Loading commit data... | |
| lxc-top | Loading commit data... | |
| lxc-version.in | Loading commit data... | |
| lxc.functions.in | Loading commit data... | |
| lxc.h | Loading commit data... | |
| lxc_attach.c | Loading commit data... | |
| lxc_cgroup.c | Loading commit data... | |
| lxc_checkpoint.c | Loading commit data... | |
| lxc_console.c | Loading commit data... | |
| lxc_execute.c | Loading commit data... | |
| lxc_freeze.c | Loading commit data... | |
| lxc_info.c | Loading commit data... | |
| lxc_init.c | Loading commit data... | |
| lxc_kill.c | Loading commit data... | |
| lxc_monitor.c | Loading commit data... | |
| lxc_restart.c | Loading commit data... | |
| lxc_start.c | Loading commit data... | |
| lxc_stop.c | Loading commit data... | |
| lxc_unfreeze.c | Loading commit data... | |
| lxc_unshare.c | Loading commit data... | |
| lxc_wait.c | Loading commit data... | |
| lxccontainer.c | Loading commit data... | |
| lxccontainer.h | Loading commit data... | |
| lxclock.c | Loading commit data... | |
| lxclock.h | Loading commit data... | |
| lxcseccomp.h | Loading commit data... | |
| lxcutmp.c | Loading commit data... | |
| lxcutmp.h | Loading commit data... | |
| mainloop.c | Loading commit data... | |
| mainloop.h | Loading commit data... | |
| monitor.c | Loading commit data... | |
| monitor.h | Loading commit data... | |
| namespace.c | Loading commit data... | |
| namespace.h | Loading commit data... | |
| network.c | Loading commit data... | |
| network.h | Loading commit data... | |
| nl.c | Loading commit data... | |
| nl.h | Loading commit data... | |
| parse.c | Loading commit data... | |
| parse.h | Loading commit data... | |
| restart.c | Loading commit data... | |
| rtnl.c | Loading commit data... | |
| rtnl.h | Loading commit data... | |
| seccomp.c | Loading commit data... | |
| start.c | Loading commit data... | |
| start.h | Loading commit data... | |
| state.c | Loading commit data... | |
| state.h | Loading commit data... | |
| stop.c | Loading commit data... | |
| sync.c | Loading commit data... | |
| sync.h | Loading commit data... | |
| utils.c | Loading commit data... | |
| utils.h | Loading commit data... | |
| version.c | Loading commit data... | |
| version.h | Loading commit data... |