From fc8b5758ca7a9b3aaf2f93d45ff570fab2a68bb8 Mon Sep 17 00:00:00 2001 From: jsmall-nvidia Date: Fri, 31 Jul 2020 12:25:58 -0400 Subject: Fix for bug where memory that has been allocated with new T[] (within a list) is freed with free in the RiffContainer. (#1473) --- source/core/slang-riff.h | 5 +++-- source/slang/slang-ir-serialize.cpp | 8 ++------ 2 files changed, 5 insertions(+), 8 deletions(-) diff --git a/source/core/slang-riff.h b/source/core/slang-riff.h index 6eeb0a722..9bdbcfdeb 100644 --- a/source/core/slang-riff.h +++ b/source/core/slang-riff.h @@ -363,9 +363,10 @@ public: /// Set the payload on a data. Payload can be passed as nullptr, if it is no memory will be copied. void setPayload(Data* data, const void* payload, size_t size); - /// Move ownership to + /// Move ownership to. + /// NOTE! The payload *must* be deallocatable via 'free' void moveOwned(Data* data, void* payload, size_t size); - /// Move unowned + /// Move unowned. The payload scope must last longer than the RiffContainer void setUnowned(Data* data, void* payload, size_t size); /// End a chunk diff --git a/source/slang/slang-ir-serialize.cpp b/source/slang/slang-ir-serialize.cpp index 369ea37c5..64316d457 100644 --- a/source/slang/slang-ir-serialize.cpp +++ b/source/slang/slang-ir-serialize.cpp @@ -462,9 +462,7 @@ static Result _writeArrayChunk(IRSerialCompressionType compressionType, FourCC c header.numCompressedEntries = uint32_t(numCompressedEntries); container->write(&header, sizeof(header)); - - const size_t compressedSize = compressedPayload.getCount(); - container->moveOwned(container->addData(), compressedPayload.detachBuffer(), compressedSize); + container->write(compressedPayload.getBuffer(), compressedPayload.getCount()); break; } default: @@ -600,9 +598,7 @@ Result _writeInstArrayChunk(IRSerialCompressionType compressionType, FourCC chun header.numCompressedEntries = 0; container->write(&header, sizeof(header)); - - const size_t compressedPayloadSize = compressedPayload.getCount(); - container->moveOwned(container->addData(), compressedPayload.detachBuffer(), compressedPayloadSize); + container->write(compressedPayload.getBuffer(), compressedPayload.getCount()); return SLANG_OK; } -- cgit v1.2.3