This merges the various labelling calls into a single label_fix_full(), which can operate on paths, on inode fds, and in a dirfd/fname style (i.e. like openat()). It also systematically separates the path to look up in the db from the path we actually use to reference the inode to relabel. This then ports tmpfiles over to labelling by fd. This should make the code a bit less racy, as we'll try hard to always operate on the very same inode, pinning it via an fd. User-visibly the behaviour should not change.
39 lines
1.1 KiB
C
39 lines
1.1 KiB
C
/* SPDX-License-Identifier: LGPL-2.1-or-later */
|
|
|
|
#include <sys/stat.h>
|
|
|
|
#include "errno-util.h"
|
|
#include "mkdir-label.h"
|
|
#include "selinux-util.h"
|
|
#include "smack-util.h"
|
|
#include "user-util.h"
|
|
|
|
int mkdirat_label(int dirfd, const char *path, mode_t mode) {
|
|
int r;
|
|
|
|
assert(path);
|
|
|
|
r = mac_selinux_create_file_prepare_at(dirfd, path, S_IFDIR);
|
|
if (r < 0)
|
|
return r;
|
|
|
|
r = RET_NERRNO(mkdirat(dirfd, path, mode));
|
|
mac_selinux_create_file_clear();
|
|
if (r < 0)
|
|
return r;
|
|
|
|
return mac_smack_fix_full(dirfd, path, NULL, 0);
|
|
}
|
|
|
|
int mkdir_safe_label(const char *path, mode_t mode, uid_t uid, gid_t gid, MkdirFlags flags) {
|
|
return mkdir_safe_internal(path, mode, uid, gid, flags, mkdirat_label);
|
|
}
|
|
|
|
int mkdir_parents_label(const char *path, mode_t mode) {
|
|
return mkdir_parents_internal(NULL, path, mode, UID_INVALID, UID_INVALID, 0, mkdirat_label);
|
|
}
|
|
|
|
int mkdir_p_label(const char *path, mode_t mode) {
|
|
return mkdir_p_internal(NULL, path, mode, UID_INVALID, UID_INVALID, 0, mkdirat_label);
|
|
}
|