diff options
Diffstat (limited to 'src/basic/conf-files.c')
-rw-r--r-- | src/basic/conf-files.c | 21 |
1 files changed, 13 insertions, 8 deletions
diff --git a/src/basic/conf-files.c b/src/basic/conf-files.c index 76750606b..b70c6e50a 100644 --- a/src/basic/conf-files.c +++ b/src/basic/conf-files.c @@ -201,14 +201,17 @@ int conf_files_insert(char ***strv, const char *root, char **dirs, const char *p if (c == 0) { char **dir; - /* Oh, we found our spot and it already contains something. */ + /* Oh, there already is an entry with a matching name (the last component). */ + STRV_FOREACH(dir, dirs) { + _cleanup_free_ char *rdir = NULL; char *p1, *p2; - p1 = path_startswith((*strv)[i], root); - if (p1) - /* Skip "/" in *dir, because p1 is without "/" too */ - p1 = path_startswith(p1, *dir + 1); + rdir = prefix_root(root, *dir); + if (!rdir) + return -ENOMEM; + + p1 = path_startswith((*strv)[i], rdir); if (p1) /* Existing entry with higher priority * or same priority, no need to do anything. */ @@ -217,7 +220,8 @@ int conf_files_insert(char ***strv, const char *root, char **dirs, const char *p p2 = path_startswith(path, *dir); if (p2) { /* Our new entry has higher priority */ - t = path_join(root, path); + + t = prefix_root(root, path); if (!t) return log_oom(); @@ -233,7 +237,8 @@ int conf_files_insert(char ***strv, const char *root, char **dirs, const char *p /* … we are not there yet, let's continue */ } - t = path_join(root, path); + /* The new file has lower priority than all the existing entries */ + t = prefix_root(root, path); if (!t) return -ENOMEM; @@ -308,7 +313,7 @@ int conf_files_list_with_replacement( if (r < 0) return log_error_errno(r, "Failed to extend config file list: %m"); - p = path_join(root, replacement); + p = prefix_root(root, replacement); if (!p) return log_oom(); } |