From e15b6e8789bd791a201bdac031561dddb59a99e4 Mon Sep 17 00:00:00 2001 From: Brian Potchik Date: Wed, 20 Aug 2025 11:25:31 -0400 Subject: Fix memory leak in LZFSE transform along with some other fixes. --- .../core/transformers/KernelCacheTransforms.cpp | 32 +++++++++++++++------- 1 file changed, 22 insertions(+), 10 deletions(-) (limited to 'view/kernelcache') diff --git a/view/kernelcache/core/transformers/KernelCacheTransforms.cpp b/view/kernelcache/core/transformers/KernelCacheTransforms.cpp index ac9ca375..5cecabad 100644 --- a/view/kernelcache/core/transformers/KernelCacheTransforms.cpp +++ b/view/kernelcache/core/transformers/KernelCacheTransforms.cpp @@ -39,23 +39,35 @@ class LZFSETransform : public Transform { public: - LZFSETransform(): - Transform(DecodeTransform, "LZFSE", "LZFSE", "Compression") + LZFSETransform(): Transform(BinaryCodecTransform, "LZFSE", "LZFSE", "Compress") { } virtual bool Decode(const DataBuffer& input, DataBuffer& output, const std::map& params) { size_t outputBufferSize = input.GetLength() * 6; - uint8_t* lzfseOutputBuffer = (uint8_t *)malloc(outputBufferSize); - uint8_t* scratchBuffer = (uint8_t *)malloc(lzfse_decode_scratch_size()); - size_t outSize = lzfse_decode_buffer(lzfseOutputBuffer, outputBufferSize, - (uint8_t *)input.GetData(), input.GetLength(), scratchBuffer); - - free(scratchBuffer); - - output = DataBuffer(lzfseOutputBuffer, outSize); + std::unique_ptr lzfseOutputBuffer(new uint8_t[outputBufferSize]); + std::unique_ptr scratchBuffer(new uint8_t[lzfse_decode_scratch_size()]); + size_t outSize = lzfse_decode_buffer(lzfseOutputBuffer.get(), outputBufferSize, + (uint8_t *)input.GetData(), input.GetLength(), + scratchBuffer.get()); + if (!outSize) + return false; + output = DataBuffer(lzfseOutputBuffer.get(), outSize); + return true; + } + virtual bool Encode(const DataBuffer& input, DataBuffer& output, const std::map&) + { + size_t outputBufferSize = input.GetLength() + (input.GetLength() / 16) + 64; + std::unique_ptr lzfseOutputBuffer(new uint8_t[outputBufferSize]); + std::unique_ptr scratchBuffer(new uint8_t[lzfse_encode_scratch_size()]); + size_t outSize = lzfse_encode_buffer(lzfseOutputBuffer.get(), outputBufferSize, + (uint8_t *)input.GetData(), input.GetLength(), + scratchBuffer.get()); + if (!outSize) + return false; + output = DataBuffer(lzfseOutputBuffer.get(), outSize); return true; } }; -- cgit v1.3.1