From b3c6d3572784575811ff130d859e92b799e77bb3 Mon Sep 17 00:00:00 2001 From: Maksim Denisov Date: Tue, 25 Feb 2025 11:46:51 +0100 Subject: ArtifactBlob: Check access to the content --- src/buildtool/execution_api/local/local_api.cpp | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) (limited to 'src/buildtool/execution_api/local/local_api.cpp') diff --git a/src/buildtool/execution_api/local/local_api.cpp b/src/buildtool/execution_api/local/local_api.cpp index c9352d25..040b4be6 100644 --- a/src/buildtool/execution_api/local/local_api.cpp +++ b/src/buildtool/execution_api/local/local_api.cpp @@ -232,16 +232,22 @@ auto LocalApi::RetrieveToMemory(Artifact::ObjectInfo const& artifact_info) auto LocalApi::Upload(std::unordered_set&& blobs, bool /*skip_find_missing*/) const noexcept -> bool { - return std::all_of( + // Blobs could have been received over the network, so a simple failure + // could result in lost traffic. Try add all blobs and fail if at least + // one is corrupted. + std::size_t const valid_count = std::count_if( blobs.begin(), blobs.end(), [&cas = local_context_.storage->CAS()](ArtifactBlob const& blob) { - auto const cas_digest = - blob.GetDigest().IsTree() - ? cas.StoreTree(*blob.ReadContent()) - : cas.StoreBlob(*blob.ReadContent(), blob.IsExecutable()); + std::optional cas_digest; + if (auto const content = blob.ReadContent()) { + cas_digest = blob.GetDigest().IsTree() + ? cas.StoreTree(*content) + : cas.StoreBlob(*content, blob.IsExecutable()); + } return cas_digest and *cas_digest == blob.GetDigest(); }); + return valid_count == blobs.size(); } auto LocalApi::UploadTree( -- cgit v1.2.3