From: Lennart Poettering Date: Tue, 21 Jul 2020 14:25:45 +0000 (+0200) Subject: offline-passwd: use chase_symlinks() X-Git-Tag: v246-rc2~25 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=002674387c595322ced45797652707f253d92f13;p=thirdparty%2Fsystemd.git offline-passwd: use chase_symlinks() In case the passwd/group file is symlinked, follow things correctly. Follow-up for: #16512 Addresses: https://github.com/systemd/systemd/pull/16512#discussion_r458073677 --- diff --git a/src/shared/offline-passwd.c b/src/shared/offline-passwd.c index 3f8220d9ac5..26a1b9c537d 100644 --- a/src/shared/offline-passwd.c +++ b/src/shared/offline-passwd.c @@ -1,6 +1,7 @@ /* SPDX-License-Identifier: LGPL-2.1+ */ #include "fd-util.h" +#include "fs-util.h" #include "offline-passwd.h" #include "path-util.h" #include "user-util.h" @@ -8,14 +9,19 @@ DEFINE_PRIVATE_HASH_OPS_WITH_KEY_DESTRUCTOR(uid_gid_hash_ops, char, string_hash_func, string_compare_func, free); static int open_passwd_file(const char *root, const char *fname, FILE **ret_file) { - const char *p = prefix_roota(root, fname); - if (!p) - return -ENOMEM; + _cleanup_free_ char *p = NULL; + _cleanup_close_ int fd = -1; + + fd = chase_symlinks_and_open(fname, root, CHASE_PREFIX_ROOT, O_RDONLY|O_CLOEXEC, &p); + if (fd < 0) + return fd; - FILE *f = fopen(p, "re"); + FILE *f = fdopen(fd, "r"); if (!f) return -errno; + TAKE_FD(fd); + log_debug("Reading %s entries from %s...", basename(fname), p); *ret_file = f;