diff options
Diffstat (limited to 'src/basic/copy.c')
-rw-r--r-- | src/basic/copy.c | 12 |
1 files changed, 8 insertions, 4 deletions
diff --git a/src/basic/copy.c b/src/basic/copy.c index aede5be991..e66d1064b9 100644 --- a/src/basic/copy.c +++ b/src/basic/copy.c @@ -973,6 +973,7 @@ int copy_directory_fd_full( void *userdata) { struct stat st; + int r; assert(dirfd >= 0); assert(to); @@ -980,8 +981,9 @@ int copy_directory_fd_full( if (fstat(dirfd, &st) < 0) return -errno; - if (!S_ISDIR(st.st_mode)) - return -ENOTDIR; + r = stat_verify_directory(&st); + if (r < 0) + return r; return fd_copy_directory(dirfd, NULL, &st, AT_FDCWD, to, st.st_dev, COPY_DEPTH_MAX, UID_INVALID, GID_INVALID, copy_flags, NULL, NULL, progress_path, progress_bytes, userdata); } @@ -995,6 +997,7 @@ int copy_directory_full( void *userdata) { struct stat st; + int r; assert(from); assert(to); @@ -1002,8 +1005,9 @@ int copy_directory_full( if (lstat(from, &st) < 0) return -errno; - if (!S_ISDIR(st.st_mode)) - return -ENOTDIR; + r = stat_verify_directory(&st); + if (r < 0) + return r; return fd_copy_directory(AT_FDCWD, from, &st, AT_FDCWD, to, st.st_dev, COPY_DEPTH_MAX, UID_INVALID, GID_INVALID, copy_flags, NULL, NULL, progress_path, progress_bytes, userdata); } |