aboutsummaryrefslogtreecommitdiff
path: root/src/zenserver/cache/cachedisklayer.cpp
diff options
context:
space:
mode:
authorStefan Boberg <[email protected]>2023-11-13 20:59:17 +0100
committerStefan Boberg <[email protected]>2023-11-13 20:59:17 +0100
commit58ac70053b45188a21706e154a102f20355f6316 (patch)
tree542564cf9cb71fb3adb0e35ddc5faff2f6e216b0 /src/zenserver/cache/cachedisklayer.cpp
parentgc history log (#519) (diff)
downloadzen-58ac70053b45188a21706e154a102f20355f6316.tar.xz
zen-58ac70053b45188a21706e154a102f20355f6316.zip
fix potential logic error in bucket manifest read
Diffstat (limited to 'src/zenserver/cache/cachedisklayer.cpp')
-rw-r--r--src/zenserver/cache/cachedisklayer.cpp38
1 files changed, 21 insertions, 17 deletions
diff --git a/src/zenserver/cache/cachedisklayer.cpp b/src/zenserver/cache/cachedisklayer.cpp
index 4289c96f9..9bb75480e 100644
--- a/src/zenserver/cache/cachedisklayer.cpp
+++ b/src/zenserver/cache/cachedisklayer.cpp
@@ -246,7 +246,9 @@ ZenCacheDiskLayer::CacheBucket::OpenOrCreate(std::filesystem::path BucketDir, bo
const auto _ =
MakeGuard([&] { ZEN_INFO("read store manifest '{}' in {}", ManifestPath, NiceTimeSpanMs(Timer.GetElapsedTimeMs())); });
- uint64_t Count = Manifest["Count"sv].AsUInt64(0);
+ const uint64_t kInvalidIndex = ~(0ull);
+
+ const uint64_t Count = Manifest["Count"sv].AsUInt64(0);
if (Count != 0)
{
std::vector<size_t> KeysIndexes;
@@ -257,20 +259,21 @@ ZenCacheDiskLayer::CacheBucket::OpenOrCreate(std::filesystem::path BucketDir, bo
if (auto It = m_Index.find(KeyView.AsHash()); It != m_Index.end())
{
KeysIndexes.push_back(It.value());
- continue;
}
- KeysIndexes.push_back((uint64_t)-1);
+ else
+ {
+ KeysIndexes.push_back(kInvalidIndex);
+ }
}
size_t KeyIndexOffset = 0;
CbArrayView TimeStampArray = Manifest["Timestamps"].AsArrayView();
for (CbFieldView& TimeStampView : TimeStampArray)
{
- size_t KeyIndex = KeysIndexes[KeyIndexOffset++];
- if (KeyIndex == (uint64_t)-1)
+ const size_t KeyIndex = KeysIndexes[KeyIndexOffset++];
+ if (KeyIndex != kInvalidIndex)
{
- continue;
+ m_AccessTimes[KeyIndex] = TimeStampView.AsInt64();
}
- m_AccessTimes[KeyIndex] = TimeStampView.AsInt64();
}
KeyIndexOffset = 0;
CbArrayView RawHashArray = Manifest["RawHash"].AsArrayView();
@@ -281,18 +284,19 @@ ZenCacheDiskLayer::CacheBucket::OpenOrCreate(std::filesystem::path BucketDir, bo
auto RawSizeIt = RawSizeArray.CreateViewIterator();
while (RawHashIt != CbFieldViewIterator())
{
- size_t KeyIndex = KeysIndexes[KeyIndexOffset++];
- if (KeyIndex == (uint64_t)-1)
- {
- continue;
- }
- uint64_t RawSize = RawSizeIt.AsUInt64();
- IoHash RawHash = RawHashIt.AsHash();
- if (RawSize != 0 || RawHash != IoHash::Zero)
+ const size_t KeyIndex = KeysIndexes[KeyIndexOffset++];
+
+ if (KeyIndex != kInvalidIndex)
{
- BucketPayload& Payload = m_Payloads[KeyIndex];
- SetMetaData(Payload, BucketMetaData{.RawSize = RawSize, .RawHash = RawHash});
+ uint64_t RawSize = RawSizeIt.AsUInt64();
+ IoHash RawHash = RawHashIt.AsHash();
+ if (RawSize != 0 || RawHash != IoHash::Zero)
+ {
+ BucketPayload& Payload = m_Payloads[KeyIndex];
+ SetMetaData(Payload, BucketMetaData{.RawSize = RawSize, .RawHash = RawHash});
+ }
}
+
RawHashIt++;
RawSizeIt++;
}