diff options
Diffstat (limited to 'src')
6 files changed, 50 insertions, 6 deletions
diff --git a/src/buildtool/execution_api/execution_service/TARGETS b/src/buildtool/execution_api/execution_service/TARGETS index cc0fad3a..56aa04d5 100644 --- a/src/buildtool/execution_api/execution_service/TARGETS +++ b/src/buildtool/execution_api/execution_service/TARGETS @@ -17,6 +17,7 @@ , ["src/buildtool/storage", "storage"] , ["src/buildtool/file_system", "file_system_manager"] , "operation_cache" + , ["src/utils/cpp", "verify_hash"] ] , "private-ldflags": ["-pthread"] } @@ -35,6 +36,7 @@ , "private-deps": [ ["src/buildtool/storage", "storage"] , ["src/buildtool/execution_api/local", "local"] + , ["src/utils/cpp", "verify_hash"] ] } , "cas_server": @@ -54,6 +56,7 @@ , ["@", "fmt", "", "fmt"] , ["src/buildtool/storage", "storage"] , ["src/buildtool/execution_api/local", "local"] + , ["src/utils/cpp", "verify_hash"] ] } , "server_implementation": @@ -98,6 +101,7 @@ , ["@", "fmt", "", "fmt"] , ["src/buildtool/storage", "storage"] , ["src/buildtool/execution_api/local", "local"] + , ["src/utils/cpp", "verify_hash"] ] } , "capabilities_server": @@ -130,6 +134,6 @@ , "deps": [["src/buildtool/logging", "logging"]] , "proto": [["@", "googleapis", "", "google_longrunning_operations_proto"]] , "stage": ["src", "buildtool", "execution_api", "execution_service"] - , "private-deps": ["operation_cache"] + , "private-deps": ["operation_cache", ["src/utils/cpp", "verify_hash"]] } } diff --git a/src/buildtool/execution_api/execution_service/ac_server.cpp b/src/buildtool/execution_api/execution_service/ac_server.cpp index 304d70dd..a83ba8a9 100644 --- a/src/buildtool/execution_api/execution_service/ac_server.cpp +++ b/src/buildtool/execution_api/execution_service/ac_server.cpp @@ -14,13 +14,19 @@ #include "src/buildtool/execution_api/execution_service/ac_server.hpp" -#include "fmt/core.h" +#include <fmt/core.h> + #include "src/buildtool/storage/garbage_collector.hpp" +#include "src/utils/cpp/verify_hash.hpp" auto ActionCacheServiceImpl::GetActionResult( ::grpc::ServerContext* /*context*/, const ::bazel_re::GetActionResultRequest* request, ::bazel_re::ActionResult* response) -> ::grpc::Status { + if (auto error_msg = IsAHash(request->action_digest().hash()); error_msg) { + logger_.Emit(LogLevel::Debug, *error_msg); + return ::grpc::Status{::grpc::StatusCode::INVALID_ARGUMENT, *error_msg}; + } logger_.Emit(LogLevel::Trace, "GetActionResult: {}", request->action_digest().hash()); diff --git a/src/buildtool/execution_api/execution_service/bytestream_server.cpp b/src/buildtool/execution_api/execution_service/bytestream_server.cpp index 476b8502..69bac9a0 100644 --- a/src/buildtool/execution_api/execution_service/bytestream_server.cpp +++ b/src/buildtool/execution_api/execution_service/bytestream_server.cpp @@ -23,6 +23,7 @@ #include "src/buildtool/execution_api/common/bytestream_common.hpp" #include "src/buildtool/storage/garbage_collector.hpp" #include "src/utils/cpp/tmp_dir.hpp" +#include "src/utils/cpp/verify_hash.hpp" namespace { auto ParseResourceName(std::string const& x) -> std::optional<std::string> { @@ -53,6 +54,11 @@ auto BytestreamServiceImpl::Read( return ::grpc::Status{::grpc::StatusCode::INVALID_ARGUMENT, str}; } + if (auto error_msg = IsAHash(*hash); error_msg) { + logger_.Emit(LogLevel::Debug, *error_msg); + return ::grpc::Status{::grpc::StatusCode::INVALID_ARGUMENT, *error_msg}; + } + auto lock = GarbageCollector::SharedLock(); if (!lock) { auto str = fmt::format("Could not acquire SharedLock"); @@ -108,6 +114,10 @@ auto BytestreamServiceImpl::Write( logger_.Emit(LogLevel::Error, str); return ::grpc::Status{::grpc::StatusCode::INVALID_ARGUMENT, str}; } + if (auto error_msg = IsAHash(*hash); error_msg) { + logger_.Emit(LogLevel::Debug, *error_msg); + return ::grpc::Status{::grpc::StatusCode::INVALID_ARGUMENT, *error_msg}; + } logger_.Emit(LogLevel::Trace, "Write: {}, offset {}, finish write {}", *hash, diff --git a/src/buildtool/execution_api/execution_service/cas_server.cpp b/src/buildtool/execution_api/execution_service/cas_server.cpp index 65cb5c92..abdab5b1 100644 --- a/src/buildtool/execution_api/execution_service/cas_server.cpp +++ b/src/buildtool/execution_api/execution_service/cas_server.cpp @@ -17,14 +17,17 @@ #include "fmt/core.h" #include "src/buildtool/compatibility/native_support.hpp" #include "src/buildtool/storage/garbage_collector.hpp" +#include "src/utils/cpp/verify_hash.hpp" static constexpr std::size_t kJustHashLength = 42; static constexpr std::size_t kSHA256Length = 64; static auto IsValidHash(std::string const& x) -> bool { + auto error_msg = IsAHash(x); auto const& length = x.size(); - return (Compatibility::IsCompatible() and length == kSHA256Length) or - length == kJustHashLength; + return !error_msg and + ((Compatibility::IsCompatible() and length == kSHA256Length) or + length == kJustHashLength); } auto CASServiceImpl::FindMissingBlobs( diff --git a/src/buildtool/execution_api/execution_service/execution_server.cpp b/src/buildtool/execution_api/execution_service/execution_server.cpp index 9705ad57..c6789235 100644 --- a/src/buildtool/execution_api/execution_service/execution_server.cpp +++ b/src/buildtool/execution_api/execution_service/execution_server.cpp @@ -26,6 +26,7 @@ #include "src/buildtool/execution_api/execution_service/operation_cache.hpp" #include "src/buildtool/file_system/file_system_manager.hpp" #include "src/buildtool/storage/garbage_collector.hpp" +#include "src/utils/cpp/verify_hash.hpp" static void UpdateTimeStamp(::google::longrunning::Operation* op) { ::google::protobuf::Timestamp t; @@ -40,6 +41,10 @@ auto ExecutionServiceImpl::GetAction(::bazel_re::ExecuteRequest const* request) const noexcept -> std::pair<std::optional<::bazel_re::Action>, std::optional<std::string>> { // get action description + if (auto error_msg = IsAHash(request->action_digest().hash()); error_msg) { + logger_.Emit(LogLevel::Error, *error_msg); + return {std::nullopt, *error_msg}; + } auto path = storage_->CAS().BlobPath(request->action_digest(), false); if (!path) { auto str = fmt::format("could not retrieve blob {} from cas", @@ -57,7 +62,11 @@ auto ExecutionServiceImpl::GetAction(::bazel_re::ExecuteRequest const* request) return {std::nullopt, str}; } } - + if (auto error_msg = IsAHash(action.input_root_digest().hash()); + error_msg) { + logger_.Emit(LogLevel::Error, *error_msg); + return {std::nullopt, *error_msg}; + } path = Compatibility::IsCompatible() ? storage_->CAS().BlobPath(action.input_root_digest(), false) : storage_->CAS().TreePath(action.input_root_digest()); @@ -74,7 +83,10 @@ auto ExecutionServiceImpl::GetAction(::bazel_re::ExecuteRequest const* request) auto ExecutionServiceImpl::GetCommand(::bazel_re::Action const& action) const noexcept -> std::pair<std::optional<::bazel_re::Command>, std::optional<std::string>> { - + if (auto error_msg = IsAHash(action.command_digest().hash()); error_msg) { + logger_.Emit(LogLevel::Error, *error_msg); + return {std::nullopt, *error_msg}; + } auto path = storage_->CAS().BlobPath(action.command_digest(), false); if (!path) { auto str = fmt::format("could not retrieve blob {} from cas", @@ -488,6 +500,10 @@ auto ExecutionServiceImpl::WaitExecution( ::grpc::ServerWriter<::google::longrunning::Operation>* writer) -> ::grpc::Status { auto const& hash = request->name(); + if (auto error_msg = IsAHash(hash); error_msg) { + logger_.Emit(LogLevel::Error, *error_msg); + return ::grpc::Status{::grpc::StatusCode::INVALID_ARGUMENT, *error_msg}; + } logger_.Emit(LogLevel::Trace, "WaitExecution: {}", hash); std::optional<::google::longrunning::Operation> op; do { diff --git a/src/buildtool/execution_api/execution_service/operations_server.cpp b/src/buildtool/execution_api/execution_service/operations_server.cpp index 37d3552a..228b3595 100644 --- a/src/buildtool/execution_api/execution_service/operations_server.cpp +++ b/src/buildtool/execution_api/execution_service/operations_server.cpp @@ -15,12 +15,17 @@ #include "src/buildtool/execution_api/execution_service/operations_server.hpp" #include "src/buildtool/execution_api/execution_service/operation_cache.hpp" +#include "src/utils/cpp/verify_hash.hpp" auto OperarationsServiceImpl::GetOperation( ::grpc::ServerContext* /*context*/, const ::google::longrunning::GetOperationRequest* request, ::google::longrunning::Operation* response) -> ::grpc::Status { auto const& hash = request->name(); + if (auto error_msg = IsAHash(hash); error_msg) { + logger_.Emit(LogLevel::Debug, *error_msg); + return ::grpc::Status{::grpc::StatusCode::INVALID_ARGUMENT, *error_msg}; + } logger_.Emit(LogLevel::Trace, "GetOperation: {}", hash); std::optional<::google::longrunning::Operation> op; op = OperationCache::Query(hash); |