From 8f294b45cbb627d31342f6a79444be59ce7e2274 Mon Sep 17 00:00:00 2001 From: Lennart Poettering Date: Tue, 17 Jun 2014 00:53:49 +0200 Subject: [PATCH] install: make sure that --root= mode doesn't make us consider all units outside of search path --- src/shared/install.c | 41 +++++++++++++++++++++++++++++++++++++---- src/shared/util.c | 16 ---------------- 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 54fbfe8a9..26dbbb6f0 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 d840dedfc..fe0582039 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 8ddd1a5da..73f7c0ad4 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_; -- 2.30.2