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
This commit is contained in:
Lennart Poettering 2020-07-21 16:25:45 +02:00
parent 628db21130
commit 002674387c
1 changed files with 10 additions and 4 deletions

View File

@ -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;
FILE *f = fopen(p, "re");
fd = chase_symlinks_and_open(fname, root, CHASE_PREFIX_ROOT, O_RDONLY|O_CLOEXEC, &p);
if (fd < 0)
return fd;
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;