1
0
mirror of https://github.com/systemd/systemd.git synced 2025-01-25 10:04:04 +03:00

copy: use xopenat() to make 'from' argument optional

This commit is contained in:
Yu Watanabe 2024-02-15 07:06:21 +09:00
parent e40b11be04
commit d1553bfd20

View File

@ -509,7 +509,6 @@ static int fd_copy_symlink(
_cleanup_free_ char *target = NULL;
int r;
assert(from);
assert(st);
assert(to);
@ -527,7 +526,10 @@ static int fd_copy_symlink(
mac_selinux_create_file_clear();
if (r < 0) {
if (FLAGS_SET(copy_flags, COPY_GRACEFUL_WARN) && (ERRNO_IS_PRIVILEGE(r) || ERRNO_IS_NOT_SUPPORTED(r))) {
log_notice_errno(r, "Failed to copy symlink '%s', ignoring: %m", from);
log_notice_errno(r, "Failed to copy symlink%s%s%s, ignoring: %m",
isempty(from) ? "" : " '",
strempty(from),
isempty(from) ? "" : "'");
return 0;
}
@ -758,7 +760,6 @@ static int fd_copy_regular(
_cleanup_close_ int fdf = -EBADF, fdt = -EBADF;
int r, q;
assert(from);
assert(st);
assert(to);
@ -768,9 +769,9 @@ static int fd_copy_regular(
if (r > 0) /* worked! */
return 0;
fdf = openat(df, from, O_RDONLY|O_CLOEXEC|O_NOCTTY|O_NOFOLLOW);
fdf = xopenat(df, from, O_RDONLY|O_CLOEXEC|O_NOCTTY|O_NOFOLLOW);
if (fdf < 0)
return -errno;
return fdf;
if (copy_flags & COPY_MAC_CREATE) {
r = mac_selinux_create_file_prepare_at(dt, to, S_IFREG);
@ -831,7 +832,6 @@ static int fd_copy_fifo(
HardlinkContext *hardlink_context) {
int r;
assert(from);
assert(st);
assert(to);
@ -850,7 +850,10 @@ static int fd_copy_fifo(
if (copy_flags & COPY_MAC_CREATE)
mac_selinux_create_file_clear();
if (FLAGS_SET(copy_flags, COPY_GRACEFUL_WARN) && (ERRNO_IS_NEG_PRIVILEGE(r) || ERRNO_IS_NEG_NOT_SUPPORTED(r))) {
log_notice_errno(r, "Failed to copy fifo '%s', ignoring: %m", from);
log_notice_errno(r, "Failed to copy fifo%s%s%s, ignoring: %m",
isempty(from) ? "" : " '",
strempty(from),
isempty(from) ? "" : "'");
return 0;
} else if (r < 0)
return r;
@ -882,7 +885,6 @@ static int fd_copy_node(
HardlinkContext *hardlink_context) {
int r;
assert(from);
assert(st);
assert(to);
@ -901,7 +903,10 @@ static int fd_copy_node(
if (copy_flags & COPY_MAC_CREATE)
mac_selinux_create_file_clear();
if (FLAGS_SET(copy_flags, COPY_GRACEFUL_WARN) && (ERRNO_IS_NEG_PRIVILEGE(r) || ERRNO_IS_NEG_NOT_SUPPORTED(r))) {
log_notice_errno(r, "Failed to copy node '%s', ignoring: %m", from);
log_notice_errno(r, "Failed to copy node%s%s%s, ignoring: %m",
isempty(from) ? "" : " '",
strempty(from),
isempty(from) ? "" : "'");
return 0;
} else if (r < 0)
return r;
@ -956,12 +961,9 @@ static int fd_copy_directory(
if (depth_left == 0)
return -ENAMETOOLONG;
if (from)
fdf = openat(df, from, O_RDONLY|O_DIRECTORY|O_CLOEXEC|O_NOCTTY|O_NOFOLLOW);
else
fdf = fcntl(df, F_DUPFD_CLOEXEC, 3);
fdf = xopenat(df, from, O_RDONLY|O_DIRECTORY|O_CLOEXEC|O_NOCTTY|O_NOFOLLOW);
if (fdf < 0)
return -errno;
return fdf;
if (!hardlink_context) {
/* If recreating hardlinks is requested let's set up a context for that now. */
@ -997,7 +999,7 @@ static int fd_copy_directory(
r = 0;
if (PTR_TO_INT(hashmap_get(denylist, st)) == DENY_CONTENTS) {
log_debug("%s is in the denylist, not recursing", from);
log_debug("%s is in the denylist, not recursing", from ?: "file to copy");
goto finish;
}
@ -1031,7 +1033,8 @@ static int fd_copy_directory(
}
if (PTR_TO_INT(hashmap_get(denylist, &buf)) == DENY_INODE) {
log_debug("%s/%s is in the denylist, ignoring", from, de->d_name);
log_debug("%s%s%s is in the denylist, ignoring",
strempty(from), isempty(from) ? "" : "/", de->d_name);
continue;
}
@ -1164,10 +1167,10 @@ static int fd_copy_tree_generic(
DenyType t = PTR_TO_INT(hashmap_get(denylist, st));
if (t == DENY_INODE) {
log_debug("%s is in the denylist, ignoring", from);
log_debug("%s is in the denylist, ignoring", from ?: "file to copy");
return 0;
} else if (t == DENY_CONTENTS)
log_debug("%s is configured to have its contents excluded, but is not a directory", from);
log_debug("%s is configured to have its contents excluded, but is not a directory", from ?: "file to copy");
r = fd_copy_leaf(df, from, st, dt, to, override_uid, override_gid, copy_flags, hardlink_context, display_path, progress_bytes, userdata);
/* We just tried to copy a leaf node of the tree. If it failed because the node already exists *and* the COPY_REPLACE flag has been provided, we should unlink the node and re-copy. */
@ -1199,11 +1202,10 @@ int copy_tree_at_full(
struct stat st;
int r;
assert(from);
assert(to);
assert(!FLAGS_SET(copy_flags, COPY_LOCK_BSD));
if (fstatat(fdf, from, &st, AT_SYMLINK_NOFOLLOW) < 0)
if (fstatat(fdf, strempty(from), &st, AT_SYMLINK_NOFOLLOW | (isempty(from) ? AT_EMPTY_PATH : 0)) < 0)
return -errno;
r = fd_copy_tree_generic(fdf, from, &st, fdt, to, st.st_dev, COPY_DEPTH_MAX, override_uid,
@ -1306,13 +1308,12 @@ int copy_file_fd_at_full(
int r;
assert(dir_fdf >= 0 || dir_fdf == AT_FDCWD);
assert(from);
assert(fdt >= 0);
assert(!FLAGS_SET(copy_flags, COPY_LOCK_BSD));
fdf = openat(dir_fdf, from, O_RDONLY|O_CLOEXEC|O_NOCTTY);
fdf = xopenat(dir_fdf, from, O_RDONLY|O_CLOEXEC|O_NOCTTY);
if (fdf < 0)
return -errno;
return fdf;
r = fd_verify_regular(fdf);
if (r < 0)
@ -1364,12 +1365,11 @@ int copy_file_at_full(
assert(dir_fdf >= 0 || dir_fdf == AT_FDCWD);
assert(dir_fdt >= 0 || dir_fdt == AT_FDCWD);
assert(from);
assert(to);
fdf = openat(dir_fdf, from, O_RDONLY|O_CLOEXEC|O_NOCTTY);
fdf = xopenat(dir_fdf, from, O_RDONLY|O_CLOEXEC|O_NOCTTY);
if (fdf < 0)
return -errno;
return fdf;
if (fstat(fdf, &st) < 0)
return -errno;
@ -1452,7 +1452,6 @@ int copy_file_atomic_at_full(
_cleanup_close_ int fdt = -EBADF;
int r;
assert(from);
assert(to);
assert(!FLAGS_SET(copy_flags, COPY_LOCK_BSD));