diff options
author | Zbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl> | 2014-04-24 01:44:10 -0400 |
---|---|---|
committer | Zbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl> | 2014-05-15 15:29:58 +0200 |
commit | 12ed81d9c88406234c20e9261ae8c8b992d8bc4d (patch) | |
tree | a18bc3403e26772f3d00c3d01c9c33cd05770e48 /src/shared/path-lookup.c | |
parent | 62b002337727093c21d020c730bd65971f7783a7 (diff) |
Make systemctl --root look for files in the proper places
Running systemctl enable/disable/set-default/... with the --root
option under strace reveals that it accessed various files and
directories in the main fs, and not underneath the specified root.
This can lead to correct results only when the layout and
configuration in the container are identical, which often is not the
case. Fix this by adding the specified root to all file access
operations.
This patch does not handle some corner cases: symlinks which point
outside of the specified root might be interpreted differently than
they would be by the kernel if the specified root was the real root.
But systemctl does not create such symlinks by itself, and I think
this is enough of a corner case not to be worth the additional
complexity of reimplementing link chasing in systemd.
Also, simplify the code in a few places and remove an hypothetical
memory leak on error.
Diffstat (limited to 'src/shared/path-lookup.c')
-rw-r--r-- | src/shared/path-lookup.c | 12 |
1 files changed, 4 insertions, 8 deletions
diff --git a/src/shared/path-lookup.c b/src/shared/path-lookup.c index 63af43cdbb..c6b4ba1e22 100644 --- a/src/shared/path-lookup.c +++ b/src/shared/path-lookup.c @@ -198,6 +198,7 @@ int lookup_paths_init( LookupPaths *p, SystemdRunningAs running_as, bool personal, + const char *root_dir, const char *generator, const char *generator_early, const char *generator_late) { @@ -275,11 +276,9 @@ int lookup_paths_init( } } - if (!path_strv_canonicalize_absolute(p->unit_path, NULL)) + if (!path_strv_canonicalize_absolute_uniq(p->unit_path, root_dir)) return -ENOMEM; - strv_uniq(p->unit_path); - if (!strv_isempty(p->unit_path)) { _cleanup_free_ char *t = strv_join(p->unit_path, "\n\t"); if (!t) @@ -331,15 +330,12 @@ int lookup_paths_init( return -ENOMEM; } - if (!path_strv_canonicalize_absolute(p->sysvinit_path, NULL)) + if (!path_strv_canonicalize_absolute_uniq(p->sysvinit_path, root_dir)) return -ENOMEM; - if (!path_strv_canonicalize_absolute(p->sysvrcnd_path, NULL)) + if (!path_strv_canonicalize_absolute_uniq(p->sysvrcnd_path, root_dir)) return -ENOMEM; - strv_uniq(p->sysvinit_path); - strv_uniq(p->sysvrcnd_path); - if (!strv_isempty(p->sysvinit_path)) { _cleanup_free_ char *t = strv_join(p->sysvinit_path, "\n\t"); if (!t) |