Blob Blame History Raw
From f73a446c8a1db5c255e6cf1bf6c5d68fe6448f10 Mon Sep 17 00:00:00 2001
From: Lennart Poettering <lennart@poettering.net>
Date: Tue, 17 Jun 2014 00:13:48 +0200
Subject: [PATCH] install: when looking for a unit file for enabling, search
 for templates only after traversing all search directories

Let's always make sure to look in all search directories for the full
unit names first, before looking for templates for them.

(cherry-picked from e50bd775163cd96be1888943a8785a436be710e8)

Resolves: #1147524
---
 src/shared/install.c | 74 +++++++++++++++++++++++++++-------------------------
 1 file changed, 38 insertions(+), 36 deletions(-)

diff --git a/src/shared/install.c b/src/shared/install.c
index 2c8f907..dc8842b 100644
--- a/src/shared/install.c
+++ b/src/shared/install.c
@@ -1074,67 +1074,69 @@ static int unit_file_search(
         assert(paths);
 
         if (info->path) {
-                char *full_path = NULL;
+                const char *path;
 
-                if (!isempty(root_dir))
-                        full_path = strappenda(root_dir, info->path);
+                if (isempty(root_dir))
+                        path = info->path;
+                else
+                        path = strappenda(root_dir, info->path);
 
-                return unit_file_load(c, info, full_path ?: info->path, allow_symlink);
+                return unit_file_load(c, info, path, allow_symlink);
         }
 
         assert(info->name);
 
         STRV_FOREACH(p, paths->unit_path) {
-                _cleanup_free_ char *path = NULL, *full_path = NULL;
+                _cleanup_free_ char *path = NULL;
 
-                path = strjoin(*p, "/", info->name, NULL);
+                if (isempty(root_dir))
+                        path = strjoin(*p, "/", info->name, NULL);
+                else
+                        path = strjoin(root_dir, "/", *p, "/", info->name, NULL);
                 if (!path)
                         return -ENOMEM;
 
-                if (!isempty(root_dir)) {
-                        full_path = strappend(root_dir, path);
-                        if (!full_path)
-                                return -ENOMEM;
-                }
-
-                r = unit_file_load(c, info, full_path ?: path, allow_symlink);
+                r = unit_file_load(c, info, path, allow_symlink);
                 if (r >= 0) {
                         info->path = path;
                         path = NULL;
-                } else if (r == -ENOENT && unit_name_is_instance(info->name)) {
-                        /* Unit file doesn't exist, however instance enablement was requested.
-                         * We will check if it is possible to load template unit file. */
-                        _cleanup_free_ char *template = NULL, *template_dir = NULL;
+                        return r;
+                }
+                if (r != -ENOENT && r != -ELOOP)
+                        return r;
+        }
 
-                        template = unit_name_template(info->name);
-                        if (!template)
-                                return -ENOMEM;
+        if (unit_name_is_instance(info->name)) {
 
-                        /* We will reuse path variable since we don't need it anymore. */
-                        template_dir = path;
-                        *(strrchr(template_dir, '/') + 1) = '\0';
+                /* Unit file doesn't exist, however instance
+                 * enablement was requested.  We will check if it is
+                 * possible to load template unit file. */
 
-                        path = strappend(template_dir, template);
+                _cleanup_free_ char *template = NULL, *template_dir = NULL;
+
+                template = unit_name_template(info->name);
+                if (!template)
+                        return -ENOMEM;
+
+                STRV_FOREACH(p, paths->unit_path) {
+                        _cleanup_free_ char *path = NULL;
+
+                        if (isempty(root_dir))
+                                path = strjoin(*p, "/", template, NULL);
+                        else
+                                path = strjoin(root_dir, "/", *p, "/", template, NULL);
                         if (!path)
                                 return -ENOMEM;
 
-                        if (!isempty(root_dir)) {
-                                free(full_path);
-                                full_path = strappend(root_dir, path);
-                                if (!full_path)
-                                        return -ENOMEM;
-                        }
-
-                        /* Let's try to load template unit. */
-                        r = unit_file_load(c, info, full_path ?: path, allow_symlink);
+                        r = unit_file_load(c, info, path, allow_symlink);
                         if (r >= 0) {
                                 info->path = path;
                                 path = NULL;
+                                return r;
                         }
+                        if (r != -ENOENT && r != -ELOOP)
+                                return r;
                 }
-
-                if (r != -ENOENT && r != -ELOOP)
-                        return r;
         }
 
         return -ENOENT;