diff options
author | Lennart Poettering <lennart@poettering.net> | 2010-06-18 20:15:34 +0200 |
---|---|---|
committer | Lennart Poettering <lennart@poettering.net> | 2010-06-18 20:15:34 +0200 |
commit | 33be102a214e7010949496549f4c737b0f8269a3 (patch) | |
tree | b44c8395dbcb7737e275de0500e17481b4baf0ee /src/manager.c | |
parent | 2cb1a60d14f869023652482a380ca7b659dcf78f (diff) |
cgroup: make sure the user cannot accidentaly unmount our cgroup filesystem
Diffstat (limited to 'src/manager.c')
-rw-r--r-- | src/manager.c | 14 |
1 files changed, 14 insertions, 0 deletions
diff --git a/src/manager.c b/src/manager.c index c93b7912eb..5e627ba9c6 100644 --- a/src/manager.c +++ b/src/manager.c @@ -197,6 +197,7 @@ static int manager_setup_signals(Manager *m) { int manager_new(ManagerRunningAs running_as, bool confirm_spawn, Manager **_m) { Manager *m; int r = -ENOMEM; + char *p; assert(_m); assert(running_as >= 0); @@ -211,6 +212,7 @@ int manager_new(ManagerRunningAs running_as, bool confirm_spawn, Manager **_m) { m->confirm_spawn = confirm_spawn; m->name_data_slot = -1; m->exit_code = _MANAGER_EXIT_CODE_INVALID; + m->pin_cgroupfs_fd = -1; m->signal_watch.fd = m->mount_watch.fd = m->udev_watch.fd = m->epoll_fd = m->dev_autofs_fd = -1; m->current_job_id = 1; /* start as id #1, so that we can leave #0 around as "null-like" value */ @@ -256,6 +258,14 @@ int manager_new(ManagerRunningAs running_as, bool confirm_spawn, Manager **_m) { (r = bus_init_api(m)) < 0) goto fail; + if (asprintf(&p, "%s/%s", m->cgroup_mount_point, m->cgroup_hierarchy) < 0) { + r = -ENOMEM; + goto fail; + } + + m->pin_cgroupfs_fd = open(p, O_RDONLY|O_CLOEXEC|O_DIRECTORY|O_NOCTTY|O_NONBLOCK); + free(p); + *_m = m; return 0; @@ -446,9 +456,13 @@ void manager_free(Manager *m) { free(m->cgroup_controller); free(m->cgroup_hierarchy); + free(m->cgroup_mount_point); hashmap_free(m->cgroup_bondings); + if (m->pin_cgroupfs_fd >= 0) + close_nointr_nofail(m->pin_cgroupfs_fd); + free(m); } |