Skip to content

Commit e15b6e8

Browse files
committed
Fix memory leak in LZFSE transform along with some other fixes.
1 parent a1249c8 commit e15b6e8

File tree

1 file changed

+22
-10
lines changed

1 file changed

+22
-10
lines changed

view/kernelcache/core/transformers/KernelCacheTransforms.cpp

Lines changed: 22 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -39,23 +39,35 @@ class LZFSETransform : public Transform
3939
{
4040

4141
public:
42-
LZFSETransform():
43-
Transform(DecodeTransform, "LZFSE", "LZFSE", "Compression")
42+
LZFSETransform(): Transform(BinaryCodecTransform, "LZFSE", "LZFSE", "Compress")
4443
{
4544
}
4645

4746
virtual bool Decode(const DataBuffer& input, DataBuffer& output, const std::map<std::string, DataBuffer>& params)
4847
{
4948
size_t outputBufferSize = input.GetLength() * 6;
50-
uint8_t* lzfseOutputBuffer = (uint8_t *)malloc(outputBufferSize);
51-
uint8_t* scratchBuffer = (uint8_t *)malloc(lzfse_decode_scratch_size());
52-
size_t outSize = lzfse_decode_buffer(lzfseOutputBuffer, outputBufferSize,
53-
(uint8_t *)input.GetData(), input.GetLength(), scratchBuffer);
54-
55-
free(scratchBuffer);
56-
57-
output = DataBuffer(lzfseOutputBuffer, outSize);
49+
std::unique_ptr<uint8_t[]> lzfseOutputBuffer(new uint8_t[outputBufferSize]);
50+
std::unique_ptr<uint8_t[]> scratchBuffer(new uint8_t[lzfse_decode_scratch_size()]);
51+
size_t outSize = lzfse_decode_buffer(lzfseOutputBuffer.get(), outputBufferSize,
52+
(uint8_t *)input.GetData(), input.GetLength(),
53+
scratchBuffer.get());
54+
if (!outSize)
55+
return false;
56+
output = DataBuffer(lzfseOutputBuffer.get(), outSize);
57+
return true;
58+
}
5859

60+
virtual bool Encode(const DataBuffer& input, DataBuffer& output, const std::map<std::string, DataBuffer>&)
61+
{
62+
size_t outputBufferSize = input.GetLength() + (input.GetLength() / 16) + 64;
63+
std::unique_ptr<uint8_t[]> lzfseOutputBuffer(new uint8_t[outputBufferSize]);
64+
std::unique_ptr<uint8_t[]> scratchBuffer(new uint8_t[lzfse_encode_scratch_size()]);
65+
size_t outSize = lzfse_encode_buffer(lzfseOutputBuffer.get(), outputBufferSize,
66+
(uint8_t *)input.GetData(), input.GetLength(),
67+
scratchBuffer.get());
68+
if (!outSize)
69+
return false;
70+
output = DataBuffer(lzfseOutputBuffer.get(), outSize);
5971
return true;
6072
}
6173
};

0 commit comments

Comments
 (0)