aboutsummaryrefslogtreecommitdiff
path: root/src/zenutil/jupiter
diff options
context:
space:
mode:
authorDan Engelbrecht <[email protected]>2025-09-04 13:17:25 +0200
committerGitHub Enterprise <[email protected]>2025-09-04 13:17:25 +0200
commit9f575bd416e1f7afbd11d4b221074f34bb89605c (patch)
tree07c87ccdbc01cdaf13015f46dddfaa71fa791d5b /src/zenutil/jupiter
parentoplog memory usage reduction (#482) (diff)
downloadzen-9f575bd416e1f7afbd11d4b221074f34bb89605c.tar.xz
zen-9f575bd416e1f7afbd11d4b221074f34bb89605c.zip
add validation of compact binary payloads before reading them (#483)
* add validation of compact binary payloads before reading them
Diffstat (limited to 'src/zenutil/jupiter')
-rw-r--r--src/zenutil/jupiter/jupiterbuildstorage.cpp37
-rw-r--r--src/zenutil/jupiter/jupitersession.cpp11
2 files changed, 43 insertions, 5 deletions
diff --git a/src/zenutil/jupiter/jupiterbuildstorage.cpp b/src/zenutil/jupiter/jupiterbuildstorage.cpp
index c9278acb4..386a91cb3 100644
--- a/src/zenutil/jupiter/jupiterbuildstorage.cpp
+++ b/src/zenutil/jupiter/jupiterbuildstorage.cpp
@@ -3,6 +3,7 @@
#include <zenutil/jupiter/jupiterbuildstorage.h>
#include <zencore/compactbinarybuilder.h>
+#include <zencore/compactbinaryutil.h>
#include <zencore/fmtutils.h>
#include <zencore/scopeguard.h>
#include <zencore/timer.h>
@@ -430,13 +431,41 @@ private:
}
else if (Payload.GetContentType() == ZenContentType::kCbObject)
{
- return LoadCompactBinaryObject(Payload);
+ CbValidateError ValidateResult = CbValidateError::None;
+ if (CbObject Object = ValidateAndReadCompactBinaryObject(IoBuffer(Payload), ValidateResult);
+ ValidateResult == CbValidateError::None)
+ {
+ return Object;
+ }
+ else
+ {
+ throw std::runtime_error(fmt::format("{}: {} ({})",
+ "Invalid compact binary object: '{}'",
+ ErrorContext,
+ ToString(Payload.GetContentType()),
+ ToString(ValidateResult)));
+ }
}
else if (Payload.GetContentType() == ZenContentType::kCompressedBinary)
{
- IoHash RawHash;
- uint64_t RawSize;
- return LoadCompactBinaryObject(CompressedBuffer::FromCompressed(SharedBuffer(Payload), RawHash, RawSize));
+ IoHash RawHash;
+ uint64_t RawSize;
+ CbValidateError ValidateResult = CbValidateError::None;
+ if (CbObject Object =
+ ValidateAndReadCompactBinaryObject(CompressedBuffer::FromCompressed(SharedBuffer(Payload), RawHash, RawSize),
+ ValidateResult);
+ ValidateResult == CbValidateError::None)
+ {
+ return Object;
+ }
+ else
+ {
+ throw std::runtime_error(fmt::format("{}: {} ({})",
+ "Invalid compresed compact binary object: '{}'",
+ ErrorContext,
+ ToString(Payload.GetContentType()),
+ ToString(ValidateResult)));
+ }
}
else
{
diff --git a/src/zenutil/jupiter/jupitersession.cpp b/src/zenutil/jupiter/jupitersession.cpp
index 1fd59acdf..c305dc477 100644
--- a/src/zenutil/jupiter/jupitersession.cpp
+++ b/src/zenutil/jupiter/jupitersession.cpp
@@ -4,6 +4,7 @@
#include <zencore/compactbinary.h>
#include <zencore/compactbinarybuilder.h>
+#include <zencore/compactbinaryutil.h>
#include <zencore/compositebuffer.h>
#include <zencore/compress.h>
#include <zencore/fmtutils.h>
@@ -526,7 +527,15 @@ JupiterSession::PutMultipartBuildBlob(std::string_view Namespace,
ZEN_WARN("{}", StartMultipartResponse.ErrorMessage("startMultipartUpload: "));
return detail::ConvertResponse(StartMultipartResponse, "JupiterSession::PutMultipartBuildBlob"sv);
}
- CbObject ResponseObject = LoadCompactBinaryObject(StartMultipartResponse.ResponsePayload);
+ CbValidateError ValidateResult = CbValidateError::None;
+ CbObject ResponseObject = ValidateAndReadCompactBinaryObject(IoBuffer(StartMultipartResponse.ResponsePayload), ValidateResult);
+ if (ValidateResult != CbValidateError::None)
+ {
+ JupiterResult Result = detail::ConvertResponse(StartMultipartResponse, "JupiterSession::PutMultipartBuildBlob"sv);
+ Result.ErrorCode = (int32)HttpResponseCode::UnsupportedMediaType;
+ Result.Reason = fmt::format("Invalid multipart response object format: '{}'", ToString(ValidateResult));
+ return Result;
+ }
struct WorkloadData
{