summaryrefslogtreecommitdiff
path: root/view/kernelcache
diff options
context:
space:
mode:
authorBrian Potchik <brian@vector35.com>2025-10-03 18:48:17 -0400
committerBrian Potchik <brian@vector35.com>2025-10-03 18:48:17 -0400
commit0fb07c24d8321bdec2d5d5a254acbb9ceaee807a (patch)
tree181ed447398789d8f4d31614ee3edb8d81ebb0af /view/kernelcache
parent183ef5e2f0ba6124efac98efba67757f1e8b2aa9 (diff)
Add zero-copy data pointer access for BinaryData objects for API-side container transforms.
Diffstat (limited to 'view/kernelcache')
-rw-r--r--view/kernelcache/core/transformers/KernelCacheTransforms.cpp11
1 files changed, 7 insertions, 4 deletions
diff --git a/view/kernelcache/core/transformers/KernelCacheTransforms.cpp b/view/kernelcache/core/transformers/KernelCacheTransforms.cpp
index 6158e7ad..be06ad9e 100644
--- a/view/kernelcache/core/transformers/KernelCacheTransforms.cpp
+++ b/view/kernelcache/core/transformers/KernelCacheTransforms.cpp
@@ -41,11 +41,14 @@ public:
if (!context || !context->GetInput())
return false;
- // TODO: DataBuffers are not zero-copy, so this is inefficient. Investigate a better way.
- auto input = context->GetInput()->ReadBuffer(0, context->GetInput()->GetLength());
+ const uint8_t* dataPtr = context->GetInput()->GetDataPointer();
+ size_t dataLength = context->GetInput()->GetDataLength();
+ if (!dataPtr || !dataLength)
+ return false;
+
DERItem item = {};
- item.data = (DERByte *)input.GetData();
- item.length = static_cast<DERSize>(std::min(input.GetLength(), (size_t)std::numeric_limits<DERSize>::max()));
+ item.data = (DERByte *)dataPtr;
+ item.length = static_cast<DERSize>(std::min(dataLength, (size_t)std::numeric_limits<DERSize>::max()));
Img4Payload payload = {};
if (auto result = DERImg4DecodePayload(&item, &payload); (result != DR_Success) && (result != DR_DecodeError))
return false;