summaryrefslogtreecommitdiff
path: root/view/kernelcache/core
diff options
context:
space:
mode:
authorBrian Potchik <brian@vector35.com>2025-10-18 21:44:07 -0400
committerBrian Potchik <brian@vector35.com>2025-10-18 21:44:07 -0400
commit419e7ef52e4d0374f19c2836b4eb358359713d57 (patch)
treeeacfaa2cf79546f103f63683a08d986f08ef9c4e /view/kernelcache/core
parent7cb009413ced6607194ff76d43f4d22c687c1d2d (diff)
Add DecodeWithContext to LZFSETransform.
Diffstat (limited to 'view/kernelcache/core')
-rw-r--r--view/kernelcache/core/transformers/KernelCacheTransforms.cpp34
1 files changed, 34 insertions, 0 deletions
diff --git a/view/kernelcache/core/transformers/KernelCacheTransforms.cpp b/view/kernelcache/core/transformers/KernelCacheTransforms.cpp
index 9e7f97ff..d15169c1 100644
--- a/view/kernelcache/core/transformers/KernelCacheTransforms.cpp
+++ b/view/kernelcache/core/transformers/KernelCacheTransforms.cpp
@@ -248,6 +248,40 @@ public:
return false;
}
+
+ virtual bool DecodeWithContext(Ref<TransformContext> context, const std::map<std::string, DataBuffer>& params) override
+ {
+ if (!context || !context->GetInput())
+ return false;
+
+ const uint8_t* dataPtr = context->GetInput()->GetDataPointer();
+ size_t dataLength = context->GetInput()->GetDataLength();
+ if (!dataPtr || !dataLength)
+ return false;
+
+ size_t outputBufferSize = dataLength * 6;
+ std::unique_ptr<uint8_t[]> scratchBuffer(new uint8_t[lzfse_decode_scratch_size()]);
+ while (true)
+ {
+ DataBuffer output(outputBufferSize);
+ size_t outSize = lzfse_decode_buffer((uint8_t *)output.GetData(), outputBufferSize, (uint8_t *)dataPtr, dataLength, scratchBuffer.get());
+ if (!outSize)
+ return false;
+ if ((outSize > 0) && (outSize < outputBufferSize))
+ {
+ output.SetSize(outSize);
+ context->SetChild(output, "");
+ return true;
+ }
+ if (output.GetLength() > (size_t(1) << 33)) // 8GB max
+ return false;
+ outputBufferSize *= 2;
+ }
+
+ return false;
+ }
+
+
virtual bool Encode(const DataBuffer& input, DataBuffer& output, const std::map<std::string, DataBuffer>&) override
{
size_t outputBufferSize = input.GetLength() + (input.GetLength() / 16) + 64;