From 4d9c3379a8767d208ed3704c8991297232627fce Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Luk=C3=A1=C5=A1=20Rozsypal?= <33589083+rqu@users.noreply.github.com> Date: Tue, 29 Dec 2020 08:06:06 +0100 Subject: [PATCH] Do not copy directory symlinks recursively. --- src/helpers/filesystem.cpp | 4 ++-- src/tasks/internal/cp_task.cpp | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/helpers/filesystem.cpp b/src/helpers/filesystem.cpp index a1033408..b986e40d 100644 --- a/src/helpers/filesystem.cpp +++ b/src/helpers/filesystem.cpp @@ -7,7 +7,7 @@ void helpers::copy_directory(const fs::path &src, const fs::path &dest) if (!fs::exists(src)) { throw filesystem_exception( "helpers::copy_directory: Source directory does not exist '" + src.string() + "'"); - } else if (!fs::is_directory(src)) { + } else if (!fs::is_directory(fs::symlink_status(src))) { throw filesystem_exception( "helpers::copy_directory: Source directory is not a directory '" + src.string() + "'"); } else if (!fs::exists(dest) && !fs::create_directories(dest)) { @@ -17,7 +17,7 @@ void helpers::copy_directory(const fs::path &src, const fs::path &dest) fs::directory_iterator endit; for (fs::directory_iterator it(src); it != endit; ++it) { - if (fs::is_directory(it->status())) { + if (fs::is_directory(it->symlink_status())) { helpers::copy_directory(it->path(), dest / it->path().filename()); } else { fs::copy(it->path(), dest / it->path().filename()); diff --git a/src/tasks/internal/cp_task.cpp b/src/tasks/internal/cp_task.cpp index 0e82c7fe..97a305c9 100644 --- a/src/tasks/internal/cp_task.cpp +++ b/src/tasks/internal/cp_task.cpp @@ -44,7 +44,7 @@ std::shared_ptr cp_task::run() for (fs::directory_iterator item(base_dir); item != end_itr; ++item) { if (regex_match(item->path().filename().string(), pattern)) { auto target = output_is_dir ? (output / item->path().filename()) : output; - if (fs::is_directory(item->path())) { + if (fs::is_directory(fs::symlink_status(item->path()))) { helpers::copy_directory(item->path(), target); } else { boost::system::error_code error_code;