From 6d178844403c09153dc272a009ade7190316c287 Mon Sep 17 00:00:00 2001 From: Sour Date: Wed, 1 Mar 2023 19:59:33 -0500 Subject: [PATCH] NES: HD Packs - Fixed memory leak in DecodePNG --- Utilities/PNGHelper.cpp | 21 ++++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/Utilities/PNGHelper.cpp b/Utilities/PNGHelper.cpp index 8c727e23..07d8494c 100644 --- a/Utilities/PNGHelper.cpp +++ b/Utilities/PNGHelper.cpp @@ -101,22 +101,26 @@ bool PNGHelper::ReadPNG(string filename, vector &pngData, uint32_t &png int PNGHelper::DecodePNG(vector& out_image, unsigned long& image_width, unsigned long& image_height, const unsigned char* in_png, size_t in_size, bool convert_to_rgba32) { int r = 0; - unique_ptr ctx = unique_ptr(spng_ctx_new(0)); - if((r = spng_set_crc_action(ctx.get(), SPNG_CRC_USE, SPNG_CRC_USE))) { + spng_ctx* ctx = spng_ctx_new(0); + if((r = spng_set_crc_action(ctx, SPNG_CRC_USE, SPNG_CRC_USE))) { + spng_ctx_free(ctx); return r; } size_t limit = 1024 * 1024 * 64; - if((r = spng_set_chunk_limits(ctx.get(), limit, limit))) { + if((r = spng_set_chunk_limits(ctx, limit, limit))) { + spng_ctx_free(ctx); return r; } - if((r = spng_set_png_buffer(ctx.get(), in_png, in_size))) { + if((r = spng_set_png_buffer(ctx, in_png, in_size))) { + spng_ctx_free(ctx); return r; } struct spng_ihdr ihdr; - if((r = spng_get_ihdr(ctx.get(), &ihdr))) { + if((r = spng_get_ihdr(ctx, &ihdr))) { + spng_ctx_free(ctx); return r; } @@ -125,15 +129,18 @@ int PNGHelper::DecodePNG(vector& out_image, unsigned long& image_ int fmt = SPNG_FMT_RGBA8; size_t out_size = 0; - if((r = spng_decoded_image_size(ctx.get(), fmt, &out_size))) { + if((r = spng_decoded_image_size(ctx, fmt, &out_size))) { + spng_ctx_free(ctx); return r; } out_image.resize(out_size); - if((r = spng_decode_image(ctx.get(), out_image.data(), out_image.size(), fmt, 0))) { + if((r = spng_decode_image(ctx, out_image.data(), out_image.size(), fmt, 0))) { + spng_ctx_free(ctx); return r; } + spng_ctx_free(ctx); return 0; } \ No newline at end of file