diff options
| author | Stefan Boberg <[email protected]> | 2023-10-06 10:27:47 +0200 |
|---|---|---|
| committer | GitHub <[email protected]> | 2023-10-06 10:27:47 +0200 |
| commit | 3a09799e45e3460cdd9a54a73e9932f58eb50e56 (patch) | |
| tree | 0e3734f14eab988b99f9ed3dcb6861022c442935 /src/zenserver/cache/cachedisklayer.cpp | |
| parent | 0.2.26 (diff) | |
| download | zen-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.cpp | 33 |
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 |