From 5ea886ab655d0acbc2fb8e2d2cc58b33c2882b7c Mon Sep 17 00:00:00 2001 From: Kawe Mazidjatari <48657826+Mauler125@users.noreply.github.com> Date: Sat, 27 Jan 2024 10:21:31 +0100 Subject: [PATCH] RTech: move ZStd free code to actual decoder Let the decoder free it to avoid memory leaks --- r5dev/rtech/pak/pakdecode.cpp | 20 ++++++++++++++------ r5dev/rtech/pak/pakparse.cpp | 9 --------- 2 files changed, 14 insertions(+), 15 deletions(-) diff --git a/r5dev/rtech/pak/pakdecode.cpp b/r5dev/rtech/pak/pakdecode.cpp index 28d0afd6..7d9609ef 100644 --- a/r5dev/rtech/pak/pakdecode.cpp +++ b/r5dev/rtech/pak/pakdecode.cpp @@ -502,11 +502,10 @@ PakRingBufferFrame_t Pak_ComputeRingBufferFrame(const uint64_t bufMask, const ui bool Pak_ZStreamDecode(PakDecoder_t* const decoder, const size_t inLen, const size_t outLen) { - // must have a zstream decoder at this point - assert(decoder->zstreamContext); - - if (decoder->inBufBytePos >= inLen) - return false; + // must have a zstream decoder at this point, and input seek pos may not + // exceed or equal inLen as we can't read past currently streamed data; + // this should've been checked before calling this function + assert(decoder->zstreamContext && decoder->inBufBytePos < inLen); PakRingBufferFrame_t outFrame = Pak_ComputeRingBufferFrame(decoder->outputMask, decoder->outBufBytePos, outLen); @@ -543,7 +542,16 @@ bool Pak_ZStreamDecode(PakDecoder_t* const decoder, const size_t inLen, const si decoder->inBufBytePos += inBuffer.pos; decoder->outBufBytePos += outBuffer.pos; - return ret == NULL; + const bool decoded = ret == NULL; + + // zstd decoder no longer necessary at this point, deallocate + if (decoded) + { + ZSTD_freeDStream(decoder->zstreamContext); + decoder->zstreamContext = nullptr; + } + + return decoded; } //----------------------------------------------------------------------------- diff --git a/r5dev/rtech/pak/pakparse.cpp b/r5dev/rtech/pak/pakparse.cpp index 4fe6a45e..20591a9d 100644 --- a/r5dev/rtech/pak/pakparse.cpp +++ b/r5dev/rtech/pak/pakparse.cpp @@ -415,15 +415,6 @@ LABEL_18: if (didDecode) DevMsg(eDLL_T::RTECH, "%s: pak '%s' decoded successfully\n", __FUNCTION__, pak->GetName()); - - if (didDecode) - { - if (useZStream && decodeContext->zstreamContext) - { - ZSTD_freeDStream(decodeContext->zstreamContext); - decodeContext->zstreamContext = nullptr; - } - } } compressedSize = v22->compressedSize;