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:
parent
e40b11be04
commit
d1553bfd20
@ -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));
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user