diff options
author | Lennart Poettering <lennart@poettering.net> | 2014-06-17 00:53:49 +0200 |
---|---|---|
committer | Lennart Poettering <lennart@poettering.net> | 2014-06-17 02:43:43 +0200 |
commit | 8f294b45cbb627d31342f6a79444be59ce7e2274 (patch) | |
tree | 04a7e2d96529725ada048da1a8648dd78f13288a /src/shared | |
parent | 559367add5e22bf32d14fa1496512c68488f48b0 (diff) |
install: make sure that --root= mode doesn't make us consider all units outside of search path
Diffstat (limited to 'src/shared')
-rw-r--r-- | src/shared/install.c | 41 | ||||
-rw-r--r-- | src/shared/util.c | 16 | ||||
-rw-r--r-- | src/shared/util.h | 1 |
3 files changed, 37 insertions, 21 deletions
diff --git a/src/shared/install.c b/src/shared/install.c index 54fbfe8a9e..26dbbb6f07 100644 --- a/src/shared/install.c +++ b/src/shared/install.c @@ -47,6 +47,37 @@ typedef struct { #define _cleanup_install_context_done_ _cleanup_(install_context_done) +static int in_search_path(const char *path, char **search, const char *root_dir) { + _cleanup_free_ char *parent = NULL; + char **i; + int r; + + assert(path); + + r = path_get_parent(path, &parent); + if (r < 0) + return r; + + STRV_FOREACH(i, search) { + _cleanup_free_ char *buf = NULL; + const char *p; + + if (root_dir) { + buf = strjoin(root_dir, "/", *i, NULL); + if (!buf) + return -ENOMEM; + + p = buf; + } else + p = *i; + + if (path_equal(parent, p)) + return 1; + } + + return 0; +} + static int lookup_paths_init_from_scope(LookupPaths *paths, UnitFileScope scope, const char *root_dir) { @@ -746,7 +777,7 @@ int unit_file_link( continue; } - q = in_search_path(*i, paths.unit_path); + q = in_search_path(*i, paths.unit_path, root_dir); if (q < 0) return q; @@ -1308,6 +1339,7 @@ static int install_info_symlink_link( InstallInfo *i, LookupPaths *paths, const char *config_path, + const char *root_dir, bool force, UnitFileChange **changes, unsigned *n_changes) { @@ -1320,7 +1352,7 @@ static int install_info_symlink_link( assert(config_path); assert(i->path); - r = in_search_path(i->path, paths->unit_path); + r = in_search_path(i->path, paths->unit_path, root_dir); if (r != 0) return r; @@ -1335,6 +1367,7 @@ static int install_info_apply( InstallInfo *i, LookupPaths *paths, const char *config_path, + const char *root_dir, bool force, UnitFileChange **changes, unsigned *n_changes) { @@ -1355,7 +1388,7 @@ static int install_info_apply( if (r == 0) r = q; - q = install_info_symlink_link(i, paths, config_path, force, changes, n_changes); + q = install_info_symlink_link(i, paths, config_path, root_dir, force, changes, n_changes); if (r == 0) r = q; @@ -1395,7 +1428,7 @@ static int install_context_apply( } else if (r >= 0) r += q; - q = install_info_apply(i, paths, config_path, force, changes, n_changes); + q = install_info_apply(i, paths, config_path, root_dir, force, changes, n_changes); if (r >= 0 && q < 0) r = q; } diff --git a/src/shared/util.c b/src/shared/util.c index d840dedfc6..fe05820395 100644 --- a/src/shared/util.c +++ b/src/shared/util.c @@ -4423,22 +4423,6 @@ int dirent_ensure_type(DIR *d, struct dirent *de) { return 0; } -int in_search_path(const char *path, char **search) { - char **i; - _cleanup_free_ char *parent = NULL; - int r; - - r = path_get_parent(path, &parent); - if (r < 0) - return r; - - STRV_FOREACH(i, search) - if (path_equal(parent, *i)) - return 1; - - return 0; -} - int get_files_in_directory(const char *path, char ***list) { _cleanup_closedir_ DIR *d = NULL; size_t bufsize = 0, n = 0; diff --git a/src/shared/util.h b/src/shared/util.h index 8ddd1a5daf..73f7c0ad4c 100644 --- a/src/shared/util.h +++ b/src/shared/util.h @@ -543,7 +543,6 @@ int glob_extend(char ***strv, const char *path); int dirent_ensure_type(DIR *d, struct dirent *de); -int in_search_path(const char *path, char **search); int get_files_in_directory(const char *path, char ***list); char *strjoin(const char *x, ...) _sentinel_; |