diff options
| author | Dan Engelbrecht <[email protected]> | 2025-12-01 11:44:02 +0100 |
|---|---|---|
| committer | GitHub Enterprise <[email protected]> | 2025-12-01 11:44:02 +0100 |
| commit | 1c24992131d2a7d8362272d1ec83382dddf45d54 (patch) | |
| tree | c4eacee25ac72bd068b234b730e0b6d4093d89c0 /src/zencore/compress.cpp | |
| parent | fix crash when parsing empty key in httpstats service (#671) (diff) | |
| download | zen-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.cpp | 15 |
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 { |