]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
copy: use xopenat() to make 'from' argument optional
authorYu Watanabe <watanabe.yu+github@gmail.com>
Wed, 14 Feb 2024 22:06:21 +0000 (07:06 +0900)
committerYu Watanabe <watanabe.yu+github@gmail.com>
Thu, 15 Feb 2024 15:25:37 +0000 (00:25 +0900)
src/shared/copy.c

index c22463e2e75448fbf31b118e34faa6168cf62933..ce815c58a2127dcfd91895b161ef1334dab2dd73 100644 (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));