diff options
author | Masahiro Matsuya <mmatsuya@redhat.com> | 2021-03-31 04:44:24 +0200 |
---|---|---|
committer | Zbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl> | 2021-04-08 11:01:13 +0200 |
commit | bec890e3cd6dac249cb12ce9430fdb78b6cf546b (patch) | |
tree | 8bf7ec613e316d9343008390e0c11da7c2458dd5 /src/tmpfiles | |
parent | Bump test-random-util timeout (diff) | |
download | systemd-bec890e3cd6dac249cb12ce9430fdb78b6cf546b.tar.xz systemd-bec890e3cd6dac249cb12ce9430fdb78b6cf546b.zip |
tmpfiles: use a entry in hashmap as ItemArray in read_config_file()
[zjs: squash commits and use size_t as appropriate.
Bug seems to have been introduced in 811a15877825da9e53f9a2a8603da34589af6bbb.
Fixes https://bugzilla.redhat.com/show_bug.cgi?id=1944468.]
Diffstat (limited to 'src/tmpfiles')
-rw-r--r-- | src/tmpfiles/tmpfiles.c | 45 |
1 files changed, 25 insertions, 20 deletions
diff --git a/src/tmpfiles/tmpfiles.c b/src/tmpfiles/tmpfiles.c index f11b4eed7c..df2b90e88f 100644 --- a/src/tmpfiles/tmpfiles.c +++ b/src/tmpfiles/tmpfiles.c @@ -3186,7 +3186,7 @@ static int read_config_file(char **config_dirs, const char *fn, bool ignore_enoe _cleanup_fclose_ FILE *_f = NULL; unsigned v = 0; FILE *f; - Item *i; + ItemArray *ia; int r = 0; assert(fn); @@ -3239,31 +3239,36 @@ static int read_config_file(char **config_dirs, const char *fn, bool ignore_enoe } /* we have to determine age parameter for each entry of type X */ - ORDERED_HASHMAP_FOREACH(i, globs) { - Item *j, *candidate_item = NULL; + ORDERED_HASHMAP_FOREACH(ia, globs) + for (size_t ni = 0; ni < ia->n_items; ni++) { + ItemArray *ja; + Item *i = ia->items + ni, *candidate_item = NULL; - if (i->type != IGNORE_DIRECTORY_PATH) - continue; - - ORDERED_HASHMAP_FOREACH(j, items) { - if (!IN_SET(j->type, CREATE_DIRECTORY, TRUNCATE_DIRECTORY, CREATE_SUBVOLUME, CREATE_SUBVOLUME_INHERIT_QUOTA, CREATE_SUBVOLUME_NEW_QUOTA)) + if (i->type != IGNORE_DIRECTORY_PATH) continue; - if (path_equal(j->path, i->path)) { - candidate_item = j; - break; - } + ORDERED_HASHMAP_FOREACH(ja, items) + for (size_t nj = 0; nj < ja->n_items; nj++) { + Item *j = ja->items + nj; - if ((!candidate_item && path_startswith(i->path, j->path)) || - (candidate_item && path_startswith(j->path, candidate_item->path) && (fnmatch(i->path, j->path, FNM_PATHNAME | FNM_PERIOD) == 0))) - candidate_item = j; - } + if (!IN_SET(j->type, CREATE_DIRECTORY, TRUNCATE_DIRECTORY, CREATE_SUBVOLUME, CREATE_SUBVOLUME_INHERIT_QUOTA, CREATE_SUBVOLUME_NEW_QUOTA)) + continue; - if (candidate_item && candidate_item->age_set) { - i->age = candidate_item->age; - i->age_set = true; + if (path_equal(j->path, i->path)) { + candidate_item = j; + break; + } + + if ((!candidate_item && path_startswith(i->path, j->path)) || + (candidate_item && path_startswith(j->path, candidate_item->path) && (fnmatch(i->path, j->path, FNM_PATHNAME | FNM_PERIOD) == 0))) + candidate_item = j; + } + + if (candidate_item && candidate_item->age_set) { + i->age = candidate_item->age; + i->age_set = true; + } } - } if (ferror(f)) { log_error_errno(errno, "Failed to read from file %s: %m", fn); |