From 23edfaec29d306e055c801bb9c945c7cde5a9438 Mon Sep 17 00:00:00 2001 From: Dan Engelbrecht Date: Mon, 29 Sep 2025 13:24:44 +0200 Subject: more cbobject validations (#527) - Improvement: Add additional validations when reading disk cache records to get references in GC --- src/zenstore/cache/cachedisklayer.cpp | 24 +++++++++++++++++++----- 1 file changed, 19 insertions(+), 5 deletions(-) (limited to 'src/zenstore/cache/cachedisklayer.cpp') diff --git a/src/zenstore/cache/cachedisklayer.cpp b/src/zenstore/cache/cachedisklayer.cpp index ba82dd942..de0678550 100644 --- a/src/zenstore/cache/cachedisklayer.cpp +++ b/src/zenstore/cache/cachedisklayer.cpp @@ -3450,13 +3450,27 @@ ZenCacheDiskLayer::CacheBucket::GetReferences(const LoggerRef& Logger, auto Log = [&Logger]() { return Logger; }; - auto GetAttachments = [&](MemoryView Data) -> bool { - if (ValidateCompactBinary(Data, CbValidateMode::Default) == CbValidateError::None) + auto GetAttachments = [&](const IoHash& RawHash, MemoryView Data) -> bool { + if (CbValidateError Error = ValidateCompactBinary(Data, CbValidateMode::Default); Error == CbValidateError::None) { CbObjectView Obj(Data.GetData()); - Obj.IterateAttachments([&](CbFieldView Field) { OutReferences.emplace_back(Field.AsAttachment()); }); + if (Obj.GetSize() == Data.GetSize()) + { + Obj.IterateAttachments([&](CbFieldView Field) { OutReferences.emplace_back(Field.AsAttachment()); }); + } + else + { + ZEN_WARN("Cache record {} payload is malformed. Payload size is {}, but compact binary object size is {}", + RawHash, + Data.GetSize(), + Obj.GetSize()); + } return true; } + else + { + ZEN_WARN("Cache record {} payload is malformed. Reason: ", RawHash, ToString(Error)); + } return false; }; @@ -3548,7 +3562,7 @@ ZenCacheDiskLayer::CacheBucket::GetReferences(const LoggerRef& Logger, } auto CaptureAttachments = [&](size_t ChunkIndex, MemoryView Data) { - if (GetAttachments(Data)) + if (GetAttachments(InlineKeys[ChunkIndex], Data)) { if (WriteMetaData) { @@ -3617,7 +3631,7 @@ ZenCacheDiskLayer::CacheBucket::GetReferences(const LoggerRef& Logger, IoBuffer Buffer = GetStandaloneCacheValue(It.second, It.first); if (Buffer) { - GetAttachments(Buffer.GetView()); + GetAttachments(It.first, Buffer.GetView()); } } return true; -- cgit v1.2.3