aboutsummaryrefslogtreecommitdiff
path: root/src/zenstore/cache/cachedisklayer.cpp
diff options
context:
space:
mode:
authorDan Engelbrecht <[email protected]>2024-08-06 14:32:51 +0200
committerGitHub Enterprise <[email protected]>2024-08-06 14:32:51 +0200
commitf63b88e96674ea8f99e1008d28224ea21a415f3a (patch)
treeb49ec2aab8ebdc56f792bdaff4e62c1961c87a0e /src/zenstore/cache/cachedisklayer.cpp
parentimprove iobuffer read error logs (#100) (diff)
downloadzen-f63b88e96674ea8f99e1008d28224ea21a415f3a.tar.xz
zen-f63b88e96674ea8f99e1008d28224ea21a415f3a.zip
validate cbobject before iterating for attachments to avoid crash on malformed data (#101)
Diffstat (limited to 'src/zenstore/cache/cachedisklayer.cpp')
-rw-r--r--src/zenstore/cache/cachedisklayer.cpp17
1 files changed, 10 insertions, 7 deletions
diff --git a/src/zenstore/cache/cachedisklayer.cpp b/src/zenstore/cache/cachedisklayer.cpp
index f865e1c3c..159f54422 100644
--- a/src/zenstore/cache/cachedisklayer.cpp
+++ b/src/zenstore/cache/cachedisklayer.cpp
@@ -3386,9 +3386,12 @@ ZenCacheDiskLayer::CacheBucket::RemoveExpiredData(GcCtx& Ctx, GcStats& Stats)
bool
ZenCacheDiskLayer::CacheBucket::GetReferencesLocked(GcCtx& Ctx, std::vector<IoHash>& OutReferences)
{
- auto GetAttachments = [&](const void* CbObjectData) {
- CbObjectView Obj(CbObjectData);
- Obj.IterateAttachments([&](CbFieldView Field) { OutReferences.emplace_back(Field.AsAttachment()); });
+ auto GetAttachments = [&](MemoryView Data) {
+ if (ValidateCompactBinary(Data, CbValidateMode::Default) == CbValidateError::None)
+ {
+ CbObjectView Obj(Data.GetData());
+ Obj.IterateAttachments([&](CbFieldView Field) { OutReferences.emplace_back(Field.AsAttachment()); });
+ }
};
std::vector<std::pair<IoHash, DiskLocation>> StandaloneKeys;
@@ -3446,13 +3449,13 @@ ZenCacheDiskLayer::CacheBucket::GetReferencesLocked(GcCtx& Ctx, std::vector<IoHa
InlineLocations,
ChunkIndexes,
[&](size_t ChunkIndex, const void* Data, uint64_t Size) {
- ZEN_UNUSED(ChunkIndex, Size);
- GetAttachments(Data);
+ ZEN_UNUSED(ChunkIndex);
+ GetAttachments(MemoryView(Data, Size));
return !Ctx.IsCancelledFlag.load();
},
[&](size_t ChunkIndex, BlockStoreFile& File, uint64_t Offset, uint64_t Size) {
ZEN_UNUSED(ChunkIndex);
- GetAttachments(File.GetChunk(Offset, Size).GetData());
+ GetAttachments(File.GetChunk(Offset, Size).GetView());
return !Ctx.IsCancelledFlag.load();
});
@@ -3472,7 +3475,7 @@ ZenCacheDiskLayer::CacheBucket::GetReferencesLocked(GcCtx& Ctx, std::vector<IoHa
IoBuffer Buffer = GetStandaloneCacheValue(It.second, It.first);
if (Buffer)
{
- GetAttachments(Buffer.GetData());
+ GetAttachments(Buffer.GetView());
}
}
return true;