]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
systemctl: also use chase_symlinks for dropins 5213/head
authorZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>
Thu, 2 Feb 2017 17:17:20 +0000 (12:17 -0500)
committerZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>
Thu, 2 Feb 2017 17:17:20 +0000 (12:17 -0500)
The general rule is:
- code in shared/ should take an "original_root" argument (possibly NULL)
  and pass it along down to chase_symlinks
- code in core/ should always use specify original_root==NULL, since we
  don't support running the manager from non-root directory
- code in systemctl and other tools should pass arg_root.

For any code that is called from tools which support --root, chase_symlinks
must be used to look up paths.

src/core/load-dropin.c
src/core/load-dropin.h
src/shared/dropin.c
src/shared/dropin.h
src/systemctl/systemctl.c

index f83fa09301530892144f42d6d517b988c64a12b8..fc07151d37ec074fcae174f32a142def81f8469f 100644 (file)
@@ -57,9 +57,11 @@ int unit_load_dropin(Unit *u) {
                 char **p;
 
                 STRV_FOREACH(p, u->manager->lookup_paths.search_path) {
-                        unit_file_process_dir(u->manager->unit_path_cache, *p, t, ".wants", UNIT_WANTS,
+                        unit_file_process_dir(NULL, u->manager->unit_path_cache, *p, t,
+                                              ".wants", UNIT_WANTS,
                                               add_dependency_consumer, u, NULL);
-                        unit_file_process_dir(u->manager->unit_path_cache, *p, t, ".requires", UNIT_REQUIRES,
+                        unit_file_process_dir(NULL, u->manager->unit_path_cache, *p, t,
+                                              ".requires", UNIT_REQUIRES,
                                               add_dependency_consumer, u, NULL);
                 }
         }
index 942d26724ed356cd80bae118d0b2ac6ba2b5dcc4..319827dfb99803036495e11d97dd252fcc874b0f 100644 (file)
@@ -25,7 +25,8 @@
 /* Read service data supplementary drop-in directories */
 
 static inline int unit_find_dropin_paths(Unit *u, char ***paths) {
-        return unit_file_find_dropin_paths(u->manager->lookup_paths.search_path,
+        return unit_file_find_dropin_paths(NULL,
+                                           u->manager->lookup_paths.search_path,
                                            u->manager->unit_path_cache,
                                            u->names,
                                            paths);
index 3cbfe13f4c49248e5c2423caa13777923bc93786..06cf3de6202d5c4a4ae461a788d29dd2cd2d0b24 100644 (file)
@@ -29,6 +29,7 @@
 #include "escape.h"
 #include "fd-util.h"
 #include "fileio-label.h"
+#include "fs-util.h"
 #include "hashmap.h"
 #include "log.h"
 #include "macro.h"
@@ -118,38 +119,46 @@ int write_drop_in_format(const char *dir, const char *unit, unsigned level,
 
 static int iterate_dir(
                 const char *path,
+                const char *original_root,
                 UnitDependency dependency,
                 dependency_consumer_t consumer,
                 void *arg,
                 char ***strv) {
 
+        _cleanup_free_ char *chased = NULL;
         _cleanup_closedir_ DIR *d = NULL;
         struct dirent *de;
         int r;
 
         assert(path);
 
+        r = chase_symlinks(path, original_root, 0, &chased);
+        if (r < 0)
+                return log_full_errno(r == -ENOENT ? LOG_DEBUG : LOG_WARNING,
+                                      r, "Failed to canonicalize path %s: %m", path);
+
         /* The config directories are special, since the order of the
          * drop-ins matters */
         if (dependency < 0)  {
-                r = strv_extend(strv, path);
+                r = strv_push(strv, chased);
                 if (r < 0)
                         return log_oom();
 
+                chased = NULL;
                 return 0;
         }
 
         assert(consumer);
 
-        d = opendir(path);
+        d = opendir(chased);
         if (!d) {
                 if (errno == ENOENT)
                         return 0;
 
-                return log_error_errno(errno, "Failed to open directory %s: %m", path);
+                return log_warning_errno(errno, "Failed to open directory %s: %m", path);
         }
 
-        FOREACH_DIRENT(de, d, return log_error_errno(errno, "Failed to read directory %s: %m", path)) {
+        FOREACH_DIRENT(de, d, return log_warning_errno(errno, "Failed to read directory %s: %m", path)) {
                 _cleanup_free_ char *f = NULL;
 
                 f = strjoin(path, "/", de->d_name);
@@ -165,6 +174,7 @@ static int iterate_dir(
 }
 
 int unit_file_process_dir(
+                const char *original_root,
                 Set *unit_path_cache,
                 const char *unit_path,
                 const char *name,
@@ -186,7 +196,7 @@ int unit_file_process_dir(
                 return log_oom();
 
         if (!unit_path_cache || set_get(unit_path_cache, path))
-                (void) iterate_dir(path, dependency, consumer, arg, strv);
+                (void) iterate_dir(path, original_root, dependency, consumer, arg, strv);
 
         if (unit_name_is_valid(name, UNIT_NAME_INSTANCE)) {
                 _cleanup_free_ char *template = NULL, *p = NULL;
@@ -201,13 +211,14 @@ int unit_file_process_dir(
                         return log_oom();
 
                 if (!unit_path_cache || set_get(unit_path_cache, p))
-                        (void) iterate_dir(p, dependency, consumer, arg, strv);
+                        (void) iterate_dir(p, original_root, dependency, consumer, arg, strv);
         }
 
         return 0;
 }
 
 int unit_file_find_dropin_paths(
+                const char *original_root,
                 char **lookup_path,
                 Set *unit_path_cache,
                 Set *names,
@@ -224,7 +235,8 @@ int unit_file_find_dropin_paths(
                 char **p;
 
                 STRV_FOREACH(p, lookup_path)
-                        unit_file_process_dir(unit_path_cache, *p, t, ".d", _UNIT_DEPENDENCY_INVALID, NULL, NULL, &strv);
+                        unit_file_process_dir(original_root, unit_path_cache, *p, t, ".d",
+                                              _UNIT_DEPENDENCY_INVALID, NULL, NULL, &strv);
         }
 
         if (strv_isempty(strv))
index c1936f397b44d18627632509ba82ed1378c9deb4..761b25088601c432b8b3a085282710e9a0df132d 100644 (file)
@@ -45,6 +45,7 @@ typedef int (*dependency_consumer_t)(UnitDependency dependency,
                                      void *arg);
 
 int unit_file_process_dir(
+                const char *original_root,
                 Set * unit_path_cache,
                 const char *unit_path,
                 const char *name,
@@ -55,6 +56,7 @@ int unit_file_process_dir(
                 char ***strv);
 
 int unit_file_find_dropin_paths(
+                const char *original_root,
                 char **lookup_path,
                 Set *unit_path_cache,
                 Set *names,
index 313e47431b1d9bbef918c8fcff9275880cbf2d2e..c4e261fc47acf9839c8606f1771953efbf4131ad 100644 (file)
@@ -2601,7 +2601,7 @@ static int unit_find_paths(
                         return log_error_errno(r, "Failed to add unit name: %m");
 
                 if (dropin_paths) {
-                        r = unit_file_find_dropin_paths(lp->search_path, NULL, names, &dropins);
+                        r = unit_file_find_dropin_paths(arg_root, lp->search_path, NULL, names, &dropins);
                         if (r < 0)
                                 return r;
                 }