aboutsummaryrefslogtreecommitdiff
path: root/src/zencore/compress.cpp
diff options
context:
space:
mode:
authorDan Engelbrecht <[email protected]>2025-12-01 11:44:02 +0100
committerGitHub Enterprise <[email protected]>2025-12-01 11:44:02 +0100
commit1c24992131d2a7d8362272d1ec83382dddf45d54 (patch)
treec4eacee25ac72bd068b234b730e0b6d4093d89c0 /src/zencore/compress.cpp
parentfix crash when parsing empty key in httpstats service (#671) (diff)
downloadzen-1c24992131d2a7d8362272d1ec83382dddf45d54.tar.xz
zen-1c24992131d2a7d8362272d1ec83382dddf45d54.zip
use scope guards to secure that BasicFile::Detach is called even on exception (#672)
Diffstat (limited to 'src/zencore/compress.cpp')
-rw-r--r--src/zencore/compress.cpp15
1 files changed, 5 insertions, 10 deletions
diff --git a/src/zencore/compress.cpp b/src/zencore/compress.cpp
index 1c623db4d..5375a9f1d 100644
--- a/src/zencore/compress.cpp
+++ b/src/zencore/compress.cpp
@@ -10,6 +10,7 @@
#include <zencore/filesystem.h>
#include <zencore/intmath.h>
#include <zencore/iohash.h>
+#include <zencore/scopeguard.h>
#include <zencore/stream.h>
#include <zencore/testing.h>
@@ -437,6 +438,7 @@ BlockEncoder::Compress(const CompositeBuffer& RawData, const uint64_t BlockSize)
UniqueBuffer RawBlockCopy = UniqueBuffer::Alloc(BlockSize);
BasicFile Source;
Source.Attach(FileRef.FileHandle);
+ auto _ = MakeGuard([&Source]() { Source.Detach(); });
for (uint64_t RawOffset = 0; RawOffset < RawSize;)
{
const uint64_t RawBlockSize = zen::Min(RawSize - RawOffset, BlockSize);
@@ -446,7 +448,6 @@ BlockEncoder::Compress(const CompositeBuffer& RawData, const uint64_t BlockSize)
MutableMemoryView CompressedBlock = CompressedBlocksView;
if (!CompressBlock(CompressedBlock, RawBlock))
{
- Source.Detach();
return CompositeBuffer();
}
@@ -465,7 +466,6 @@ BlockEncoder::Compress(const CompositeBuffer& RawData, const uint64_t BlockSize)
CompressedSize += CompressedBlockSize;
RawOffset += RawBlockSize;
}
- Source.Detach();
}
else
{
@@ -561,6 +561,7 @@ BlockEncoder::CompressToStream(
UniqueBuffer RawBlockCopy = UniqueBuffer::Alloc(BlockSize);
BasicFile Source;
Source.Attach(FileRef.FileHandle);
+ auto _ = MakeGuard([&Source]() { Source.Detach(); });
for (uint64_t RawOffset = 0; RawOffset < RawSize;)
{
const uint64_t RawBlockSize = zen::Min(RawSize - RawOffset, BlockSize);
@@ -570,7 +571,6 @@ BlockEncoder::CompressToStream(
MutableMemoryView CompressedBlock = CompressedBlockBuffer.GetMutableView();
if (!CompressBlock(CompressedBlock, RawBlock))
{
- Source.Detach();
return false;
}
@@ -595,7 +595,6 @@ BlockEncoder::CompressToStream(
CompressedSize += CompressedBlockSize;
RawOffset += RawBlockSize;
}
- Source.Detach();
}
else
{
@@ -868,6 +867,7 @@ BlockDecoder::DecompressToStream(
ZEN_ASSERT(FileRef.FileHandle != nullptr);
BasicFile Source;
Source.Attach(FileRef.FileHandle);
+ auto _ = MakeGuard([&Source]() { Source.Detach(); });
for (size_t BlockIndex = FirstBlockIndex; BlockIndex <= LastBlockIndex; BlockIndex++)
{
@@ -899,7 +899,6 @@ BlockDecoder::DecompressToStream(
MutableMemoryView UncompressedBlock = RawDataBuffer.GetMutableView().Left(UncompressedBlockSize);
if (!DecompressBlock(UncompressedBlock, CompressedBlock))
{
- Source.Detach();
return false;
}
if (!Callback(CompressedOffset,
@@ -907,7 +906,6 @@ BlockDecoder::DecompressToStream(
BlockIndex * BlockSize + OffsetInFirstBlock,
CompositeBuffer(IoBuffer(IoBuffer::Wrap, RawDataBuffer.GetData(), BytesToUncompress))))
{
- Source.Detach();
return false;
}
}
@@ -920,7 +918,6 @@ BlockDecoder::DecompressToStream(
CompositeBuffer(
IoBuffer(IoBuffer::Wrap, CompressedBlockCopy.GetView().Mid(OffsetInFirstBlock).GetData(), BytesToUncompress))))
{
- Source.Detach();
return false;
}
}
@@ -929,7 +926,6 @@ BlockDecoder::DecompressToStream(
RemainingRawSize -= BytesToUncompress;
CompressedOffset += CompressedBlockSize;
}
- Source.Detach();
}
else
{
@@ -1027,6 +1023,7 @@ BlockDecoder::TryDecompressTo(const BufferHeader& Header,
ZEN_ASSERT(FileRef.FileHandle != nullptr);
BasicFile Source;
Source.Attach(FileRef.FileHandle);
+ auto _ = MakeGuard([&Source]() { Source.Detach(); });
for (size_t BlockIndex = FirstBlockIndex; BlockIndex <= LastBlockIndex; BlockIndex++)
{
@@ -1063,7 +1060,6 @@ BlockDecoder::TryDecompressTo(const BufferHeader& Header,
if (!DecompressBlock(UncompressedBlock, CompressedBlock))
{
- Source.Detach();
return false;
}
@@ -1082,7 +1078,6 @@ BlockDecoder::TryDecompressTo(const BufferHeader& Header,
CompressedOffset += CompressedBlockSize;
RawView += BytesToUncompress;
}
- Source.Detach();
}
else
{