diff options
| author | Dan Engelbrecht <[email protected]> | 2025-09-04 13:17:25 +0200 |
|---|---|---|
| committer | GitHub Enterprise <[email protected]> | 2025-09-04 13:17:25 +0200 |
| commit | 9f575bd416e1f7afbd11d4b221074f34bb89605c (patch) | |
| tree | 07c87ccdbc01cdaf13015f46dddfaa71fa791d5b /src/zenutil/jupiter | |
| parent | oplog memory usage reduction (#482) (diff) | |
| download | zen-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.cpp | 37 | ||||
| -rw-r--r-- | src/zenutil/jupiter/jupitersession.cpp | 11 |
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 { |