From dcd407b5e767d43ad1f9de31b36c2632c82cc41f Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Thu, 22 Jun 2023 16:12:24 +0900 Subject: [PATCH 1/3] copy: add one more assertions about copy_flags Follow-up for 01428141ba42a06d22f2c0e0df26049e700f4098. --- src/shared/copy.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/shared/copy.c b/src/shared/copy.c index db26945be8..5a4a8aaf0d 100644 --- a/src/shared/copy.c +++ b/src/shared/copy.c @@ -1133,8 +1133,11 @@ static int fd_copy_tree_generic( copy_progress_path_t progress_path, copy_progress_bytes_t progress_bytes, void *userdata) { + int r; + assert(!FLAGS_SET(copy_flags, COPY_LOCK_BSD)); + if (S_ISDIR(st->st_mode)) return fd_copy_directory(df, from, st, dt, to, original_device, depth_left-1, override_uid, override_gid, copy_flags, denylist, hardlink_context, display_path, From 440ccf0424f8b6bba891d9c98351beb387759424 Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Fri, 23 Jun 2023 10:10:58 +0900 Subject: [PATCH 2/3] copy: fix fd leak Follow-up for 01428141ba42a06d22f2c0e0df26049e700f4098. --- src/shared/copy.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/shared/copy.c b/src/shared/copy.c index 5a4a8aaf0d..9d3db2d771 100644 --- a/src/shared/copy.c +++ b/src/shared/copy.c @@ -1233,6 +1233,7 @@ int copy_directory_at_full( copy_progress_bytes_t progress_bytes, void *userdata) { + _cleanup_close_ int fdt = -EBADF; struct stat st; int r; @@ -1262,11 +1263,14 @@ int copy_directory_at_full( if (r < 0) return r; + if (FLAGS_SET(copy_flags, COPY_LOCK_BSD)) + fdt = r; + r = sync_dir_by_flags(dir_fdt, to, copy_flags); if (r < 0) return r; - return 0; + return FLAGS_SET(copy_flags, COPY_LOCK_BSD) ? TAKE_FD(fdt) : 0; } int copy_file_fd_at_full( From b62e2891ef2d2da46f98717a539085b3250f82ff Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Thu, 22 Jun 2023 16:13:29 +0900 Subject: [PATCH 3/3] copy: propagate error in fd_copy_directory() Follow-up for 01428141ba42a06d22f2c0e0df26049e700f4098. Fixes CID#1513190. --- src/shared/copy.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/shared/copy.c b/src/shared/copy.c index 9d3db2d771..241a2d112b 100644 --- a/src/shared/copy.c +++ b/src/shared/copy.c @@ -1084,6 +1084,9 @@ finish: return -errno; } + if (r < 0) + return r; + return copy_flags & COPY_LOCK_BSD ? TAKE_FD(fdt) : 0; }