aboutsummaryrefslogtreecommitdiff
path: root/src/zenserver/cache/cachedisklayer.cpp
diff options
context:
space:
mode:
authorStefan Boberg <[email protected]>2023-10-06 10:27:47 +0200
committerGitHub <[email protected]>2023-10-06 10:27:47 +0200
commit3a09799e45e3460cdd9a54a73e9932f58eb50e56 (patch)
tree0e3734f14eab988b99f9ed3dcb6861022c442935 /src/zenserver/cache/cachedisklayer.cpp
parent0.2.26 (diff)
downloadzen-3a09799e45e3460cdd9a54a73e9932f58eb50e56.tar.xz
zen-3a09799e45e3460cdd9a54a73e9932f58eb50e56.zip
reject known bad bucket names in structured cache (#452)v0.2.27-pre0
* added string_view helpers for ParseHexBytes/ParseHexNumber * reject known bad buckets in structured cache put handler (32-character hex bucket names are rejected) * also added bucket rejection logic to bucket discovery * added rejected_writes stat to HttpStructuredCache
Diffstat (limited to 'src/zenserver/cache/cachedisklayer.cpp')
-rw-r--r--src/zenserver/cache/cachedisklayer.cpp33
1 files changed, 32 insertions, 1 deletions
diff --git a/src/zenserver/cache/cachedisklayer.cpp b/src/zenserver/cache/cachedisklayer.cpp
index 894676d6a..177d37aa9 100644
--- a/src/zenserver/cache/cachedisklayer.cpp
+++ b/src/zenserver/cache/cachedisklayer.cpp
@@ -2145,17 +2145,26 @@ ZenCacheDiskLayer::DiscoverBuckets()
// Initialize buckets
+ std::vector<std::filesystem::path> BadBucketDirectories;
+
RwLock::ExclusiveLockScope _(m_Lock);
for (const std::filesystem::path& BucketPath : DirContent.Directories)
{
const std::string BucketName = PathToUtf8(BucketPath.stem());
- // New bucket needs to be created
+
if (auto It = m_Buckets.find(BucketName); It != m_Buckets.end())
{
continue;
}
+ if (IsKnownBadBucketName(BucketName))
+ {
+ BadBucketDirectories.push_back(BucketPath);
+
+ continue;
+ }
+
auto InsertResult = m_Buckets.emplace(BucketName, std::make_unique<CacheBucket>(BucketName));
CacheBucket& Bucket = *InsertResult.first->second;
@@ -2176,6 +2185,28 @@ ZenCacheDiskLayer::DiscoverBuckets()
}
ZEN_INFO("Discovered bucket '{}'", BucketName);
}
+
+ for (const std::filesystem::path& BadBucketPath : BadBucketDirectories)
+ {
+ bool IsOk = false;
+
+ try
+ {
+ IsOk = DeleteDirectories(BadBucketPath);
+ }
+ catch (std::exception&)
+ {
+ }
+
+ if (IsOk)
+ {
+ ZEN_INFO("found bad bucket at '{}', deleted contents", BadBucketPath);
+ }
+ else
+ {
+ ZEN_WARN("bad bucket delete failed for '{}'", BadBucketPath);
+ }
+ }
}
bool