From 8f294b45cbb627d31342f6a79444be59ce7e2274 Mon Sep 17 00:00:00 2001 From: Lennart Poettering Date: Tue, 17 Jun 2014 00:53:49 +0200 Subject: install: make sure that --root= mode doesn't make us consider all units outside of search path --- src/shared/install.c | 41 +++++++++++++++++++++++++++++++++++++---- 1 file changed, 37 insertions(+), 4 deletions(-) (limited to 'src/shared/install.c') 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; } -- cgit v1.2.3-54-g00ecf