From 7b66b3de8db9a390f460604b0807e8db6eb0c9ed Mon Sep 17 00:00:00 2001 From: spycrab Date: Wed, 27 Feb 2019 08:32:38 +0100 Subject: [PATCH] UpdaterCommon: Prevent duplicate downloads and respect symlinks --- Source/Core/UpdaterCommon/UpdaterCommon.cpp | 33 +++++++++++---------- 1 file changed, 18 insertions(+), 15 deletions(-) diff --git a/Source/Core/UpdaterCommon/UpdaterCommon.cpp b/Source/Core/UpdaterCommon/UpdaterCommon.cpp index 3a65829cfd..456576d5e7 100644 --- a/Source/Core/UpdaterCommon/UpdaterCommon.cpp +++ b/Source/Core/UpdaterCommon/UpdaterCommon.cpp @@ -187,6 +187,11 @@ static bool DownloadContent(const std::vector& to_download auto& download = to_download[i]; std::string hash_filename = HexEncode(download.hash.data(), download.hash.size()); + + // File already exists, skipping + if (File::Exists(temp_path + DIR_SEP + hash_filename)) + continue; + UI::SetDescription("Downloading " + download.filename + "... (File " + std::to_string(i + 1) + " of " + std::to_string(to_download.size()) + ")"); UI::SetCurrentMarquee(false); @@ -279,26 +284,18 @@ std::optional FindOrCreateTempDir(const std::string& base_path) std::string temp_path = base_path + DIR_SEP + UPDATE_TEMP_DIR; int counter = 0; + File::DeleteDirRecursively(temp_path); + do { - if (!File::Exists(temp_path)) - { - if (File::CreateDir(temp_path)) - { - return temp_path; - } - else - { - fprintf(log_fp, "Couldn't create temp directory.\n"); - return {}; - } - } - else if (File::IsDirectory(temp_path)) + if (File::CreateDir(temp_path)) { return temp_path; } else { + fprintf(log_fp, "Couldn't create temp directory.\n"); + // Try again with a counter appended to the path. std::string suffix = UPDATE_TEMP_DIR + std::to_string(counter); temp_path = base_path + DIR_SEP + suffix; @@ -385,8 +382,14 @@ static bool UpdateFiles(const std::vector& to_update, #ifndef _WIN32 struct stat file_stats; - if (stat(path.c_str(), &file_stats) != 0) - return false; + if (lstat(path.c_str(), &file_stats) != 0) + continue; + + if (S_ISLNK(file_stats.st_mode)) + { + fprintf(log_fp, "%s is symlink, skipping\n", path.c_str()); + continue; + } permission = file_stats.st_mode; #endif