be0c12
From 81b967279f6e23474b1e7a0ea9b4ecf9405f87bb Mon Sep 17 00:00:00 2001
be0c12
From: Masahiro Matsuya <mmatsuya@redhat.com>
be0c12
Date: Wed, 31 Mar 2021 11:44:24 +0900
be0c12
Subject: [PATCH] tmpfiles: use a entry in hashmap as ItemArray in
be0c12
 read_config_file()
be0c12
be0c12
[zjs: squash commits and use size_t as appropriate.
be0c12
be0c12
Bug seems to have been introduced in 811a15877825da9e53f9a2a8603da34589af6bbb.
be0c12
Fixes https://bugzilla.redhat.com/show_bug.cgi?id=1944468.]
be0c12
be0c12
(cherry picked from commit bec890e3cd6dac249cb12ce9430fdb78b6cf546b)
be0c12
be0c12
Resolves: #1944468
be0c12
---
be0c12
 src/tmpfiles/tmpfiles.c | 47 +++++++++++++++++++++++------------------
be0c12
 1 file changed, 26 insertions(+), 21 deletions(-)
be0c12
be0c12
diff --git a/src/tmpfiles/tmpfiles.c b/src/tmpfiles/tmpfiles.c
be0c12
index 927de35f32..1aeeed0d2e 100644
be0c12
--- a/src/tmpfiles/tmpfiles.c
be0c12
+++ b/src/tmpfiles/tmpfiles.c
be0c12
@@ -2646,7 +2646,7 @@ static int read_config_file(char **config_dirs, const char *fn, bool ignore_enoe
be0c12
         char line[LINE_MAX];
be0c12
         Iterator iterator;
be0c12
         unsigned v = 0;
be0c12
-        Item *i;
be0c12
+        ItemArray *ia;
be0c12
         int r = 0;
be0c12
 
be0c12
         assert(fn);
be0c12
@@ -2692,32 +2692,37 @@ static int read_config_file(char **config_dirs, const char *fn, bool ignore_enoe
be0c12
         }
be0c12
 
be0c12
         /* we have to determine age parameter for each entry of type X */
be0c12
-        ORDERED_HASHMAP_FOREACH(i, globs, iterator) {
be0c12
-                Iterator iter;
be0c12
-                Item *j, *candidate_item = NULL;
be0c12
+        ORDERED_HASHMAP_FOREACH(ia, globs, iterator)
be0c12
+                for (size_t ni = 0; ni < ia->count; ni++) {
be0c12
+                        Iterator iter;
be0c12
+                        ItemArray *ja;
be0c12
+                        Item *i = ia->items + ni, *candidate_item = NULL;
be0c12
 
be0c12
-                if (i->type != IGNORE_DIRECTORY_PATH)
be0c12
-                        continue;
be0c12
-
be0c12
-                ORDERED_HASHMAP_FOREACH(j, items, iter) {
be0c12
-                        if (!IN_SET(j->type, CREATE_DIRECTORY, TRUNCATE_DIRECTORY, CREATE_SUBVOLUME, CREATE_SUBVOLUME_INHERIT_QUOTA, CREATE_SUBVOLUME_NEW_QUOTA))
be0c12
+                        if (i->type != IGNORE_DIRECTORY_PATH)
be0c12
                                 continue;
be0c12
 
be0c12
-                        if (path_equal(j->path, i->path)) {
be0c12
-                                candidate_item = j;
be0c12
-                                break;
be0c12
-                        }
be0c12
+                        ORDERED_HASHMAP_FOREACH(ja, items, iter)
be0c12
+                                for (size_t nj = 0; nj < ja->count; nj++) {
be0c12
+                                        Item *j = ja->items + nj;
be0c12
 
be0c12
-                        if ((!candidate_item && path_startswith(i->path, j->path)) ||
be0c12
-                            (candidate_item && path_startswith(j->path, candidate_item->path) && (fnmatch(i->path, j->path, FNM_PATHNAME | FNM_PERIOD) == 0)))
be0c12
-                                candidate_item = j;
be0c12
-                }
be0c12
+                                        if (!IN_SET(j->type, CREATE_DIRECTORY, TRUNCATE_DIRECTORY, CREATE_SUBVOLUME, CREATE_SUBVOLUME_INHERIT_QUOTA, CREATE_SUBVOLUME_NEW_QUOTA))
be0c12
+                                                continue;
be0c12
 
be0c12
-                if (candidate_item && candidate_item->age_set) {
be0c12
-                        i->age = candidate_item->age;
be0c12
-                        i->age_set = true;
be0c12
+                                        if (path_equal(j->path, i->path)) {
be0c12
+                                                candidate_item = j;
be0c12
+                                                break;
be0c12
+                                        }
be0c12
+
be0c12
+                                        if ((!candidate_item && path_startswith(i->path, j->path)) ||
be0c12
+                                            (candidate_item && path_startswith(j->path, candidate_item->path) && (fnmatch(i->path, j->path, FNM_PATHNAME | FNM_PERIOD) == 0)))
be0c12
+                                                candidate_item = j;
be0c12
+                                }
be0c12
+
be0c12
+                        if (candidate_item && candidate_item->age_set) {
be0c12
+                                i->age = candidate_item->age;
be0c12
+                                i->age_set = true;
be0c12
+                        }
be0c12
                 }
be0c12
-        }
be0c12
 
be0c12
         if (ferror(f)) {
be0c12
                 log_error_errno(errno, "Failed to read from file %s: %m", fn);