From 1a5c121b4a69aecffb9416e8dfb875cd3deb9804 Mon Sep 17 00:00:00 2001 From: Andrew Bell Date: Tue, 7 May 2019 10:23:45 -0400 Subject: [PATCH] Use random numbers to create temp filenames. Close #2474 --- vendor/arbiter/arbiter.cpp | 28 +++++++++++++++++++++------- vendor/arbiter/arbiter.hpp | 10 ++++++++-- 2 files changed, 29 insertions(+), 9 deletions(-) diff --git a/vendor/arbiter/arbiter.cpp b/vendor/arbiter/arbiter.cpp index 677f709553..ae25b7cc19 100644 --- a/vendor/arbiter/arbiter.cpp +++ b/vendor/arbiter/arbiter.cpp @@ -431,7 +431,7 @@ std::unique_ptr Arbiter::getLocalHandle( const auto ext(getExtension(path)); const std::string basename( - crypto::encodeAsHex(crypto::sha256(stripExtension(path))) + + std::to_string(util::randomNumber()) + (ext.size() ? "." + ext : "")); tempEndpoint.put(basename, getBinary(path)); localHandle.reset( @@ -702,9 +702,7 @@ std::unique_ptr Endpoint::getLocalHandle( { const std::string tmp(fs::getTempPath()); const auto ext(Arbiter::getExtension(subpath)); - const std::string basename( - crypto::encodeAsHex(crypto::sha256(Arbiter::stripExtension( - prefixedRoot() + subpath))) + + const std::string basename(std::to_string(util::randomNumber()) + (ext.size() ? "." + ext : "")); const std::string local(tmp + basename); @@ -4727,6 +4725,8 @@ int64_t Time::asUnix() const #include #include +#include +#include #ifdef ARBITER_CUSTOM_NAMESPACE namespace ARBITER_CUSTOM_NAMESPACE @@ -4738,6 +4738,20 @@ namespace arbiter namespace util { +namespace +{ + std::mutex randomMutex; + std::random_device rd; + std::mt19937 gen(rd()); + std::uniform_int_distribution distribution; +} + +uint64_t randomNumber() +{ + std::lock_guard lock(randomMutex); + return distribution(gen); +} + std::string stripPostfixing(const std::string path) { std::string stripped(path); @@ -4763,11 +4777,11 @@ std::string getBasename(const std::string fullPath) // Now do the real slash searching. std::size_t pos(stripped.rfind('/')); - + // Maybe windows - if (pos == std::string::npos) + if (pos == std::string::npos) pos = stripped.rfind('\\'); - + if (pos != std::string::npos) { const std::string sub(stripped.substr(pos + 1)); diff --git a/vendor/arbiter/arbiter.hpp b/vendor/arbiter/arbiter.hpp index 3f1b3efadb..817a0a97d8 100644 --- a/vendor/arbiter/arbiter.hpp +++ b/vendor/arbiter/arbiter.hpp @@ -4379,6 +4379,12 @@ namespace arbiter /** General utilities. */ namespace util { + /** + Returns a random number based on a random device if one exists on + the system. + */ + ARBITER_DLL uint64_t randomNumber(); + /** Returns @p path, less any trailing glob indicators (one or two * asterisks) as well as any possible trailing slash. */ @@ -4463,7 +4469,7 @@ namespace util #ifdef ARBITER_WINDOWS sep = "\\"; #else - sep = "/"; + sep = "/"; #endif } else if (next.empty() && currentIsDir) @@ -4475,7 +4481,7 @@ namespace util #ifdef ARBITER_WINDOWS sep = "\\"; #else - sep = "/"; + sep = "/"; #endif }